Mostrando postagens com marcador PHP. Mostrar todas as postagens
Mostrando postagens com marcador PHP. Mostrar todas as postagens

Inovação x necessidade: qual o custo?


Em sua apresentação no 7Masters Zend Framework, em setembro deste ano, Ronny Nascimento, diretor de operações da Flex Interativa, falou sobre a relação de inovação e necessidade em relação aos custos para a empresa, além das razões de utilizar o Zend Framework em sua empresa.

Upload progress bar com PHP 5.4

A versão 5.4 do PHP traz inúmeras atualizações e novas características, e dentre elas, está a possibilidade de monitorar o progresso do upload de arquivos via formulários, que antes só era possível mediante instalação de componentes PECL ou aplicando patches no código-fonte do PHP antes de compilá-lo.

Se você fizer uma consulta às configurações do PHP, verá que existem as novas session.upload_progress.enabled, session.upload_progress.cleanup, session.upload_progress.prefix, session.upload_progress.name, session.upload_progress.freq e session.upload_progress.min_freq. Estas variáveis definem o comportamento do PHP no momento da detecção e atualização das informações dos uploads de arquivos.

Para implementar uma barra de progresso que mostrará ao usuário as informações do upload depois que o formulário teve seu envio disparado, fiz algum código para exemplificar o processo. O código foi feito a partir de uma instalação "limpa" do Apache e do PHP.

upload.php (este é o arquivo que contém o formulário e as declarações de CSS e JavaScript necessárias, que podem estar em arquivos separados e chamados via SRC e HREF)
<?php

$is_PHP54_installed = ($x = @ini_get('session.upload_progress.name'));

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP 5.4 Upload Progress Bar Demo<?php echo (!$is_PHP54_installed ? ' (will not working, installed PHP version is ' . phpversion() . ')' : '') ?></title>

<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<style type="text/css">
#upload_progress_status {
  display: none;
  width: 50%;
  margin: 20px 0px 0px 0px;
  overflow: hidden;
}

#upload_progress_status .bar,
#upload_progress_status .bar .progress {
  display: block;
  line-height: 20px;
  overflow: hidden;
}

#upload_progress_status .bar {
  border: 1px solid #000;
}

#upload_progress_status .bar .progress {
  width: 0%;
  background-color: #000;
  color: #fff;
  font-size: 12px;
  font-weight: bolder;
  text-align: center;
}

#form {
  display: block;
}

#loading {
  display: none;
}
</style>

<script type="text/javascript">
<!--
  $j = jQuery;

  upload_progress_status_timer = <?php echo (int)(@ini_get('session.upload_progress.min_freq')) * 1000 ?>;

  upload_progress_status_load = function () {
    try { upload_progress_status_load_XMLHTTP.abort(); } catch (e) {}

    upload_progress_status_load_XMLHTTP = $j.ajax ({ url: "upload_progress_status.php",
      dataType: "json",
      error: function () {
        setTimeout(function () { upload_progress_status_load(); }, upload_progress_status_timer);
      },
      success: function (info) {
        var ups = $j("#upload_progress_status"),
          bu = $j("#upload_progress_status .bytes_processed"),
          cl = $j("#upload_progress_status .content_length"),
          et = $j("#upload_progress_status .elapsed_time"),
          pbp = $j("#upload_progress_status .bar .progress");

        if (info != null) {
          ups.show();

          bu.html(info.bytes_processed_human);
          cl.html(info.content_length_human);
          et.html(info.elapsed_time_human);
          pbp.stop().animate({ width: info.uploaded }, upload_progress_status_timer).html(info.uploaded);

          if (!info.done) setTimeout(function () { upload_progress_status_load(); }, upload_progress_status_timer);
          else ups.hide();
        }
      }
    });
  }

  form_loading = function () {
    $j("#form").hide();
    $j("#loading").show();
  }
-->
</script>
</head>
<body>
<div id="form">
  <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data"<?php if ($is_PHP54_installed) { ?> onsubmit="form_loading(); upload_progress_status_load()"<?php } ?>><?php
  if ($is_PHP54_installed) { ?><input type="hidden" name="<?php echo $x ?>" value="demo" /><?php }

  for ($k=0; $k<=4; $k ) {
    ?>File <?php echo $k 1 ?>: <input type="file" name="files[<?php echo $k ?>]" size="30" /><br/><?php
  }

  ?><input type="submit" value="Send files" />
  </form>

  <?php if (count($_FILES)) echo '<pre>' . print_r($_FILES, true) . '</pre>' ?>
</div>

<div id="loading">Sending...</div>

<div id="upload_progress_status">
  <div class="bar"><div class="progress">0%</div></div>
  <span class="bytes_processed">0</span> of <span class="content_length">0</span><br/>
  <span class="elapsed_time">00:00</span> elapsed time
</div>
</body>
</html>

upload_progress_status.php (este é o arquivo que retornará ao JavaScript as informações do progresso do upload)
<?php

@session_start();

function get_user_readable_filesize ($fs) {
  $fsl = array('bytes', 'KB', 'MB', 'GB', 'PB', 'YB');
  $y = 0;
  while ($fs >= 1024) {
    $fs /= 1024;
    $y ;
  }
  return number_format($fs, $y ? 2 : 0, '.', '') . ' ' . $fsl[$y];
}

if (($info = @$_SESSION[ini_get('session.upload_progress.prefix') . 'demo'])) {
  $info['content_length_human'] = get_user_readable_filesize($info['content_length']);
  $info['bytes_processed_human'] = get_user_readable_filesize($info['bytes_processed']);

  $info['elapsed_time'] = time() - $info['start_time'];
  $info['elapsed_time_human'] = sprintf('%02d', (int)($info['elapsed_time'] / 60)) . ':' . sprintf('%02d', (int)($info['elapsed_time'] % 60));

  $info['uploaded'] = number_format(($info['bytes_processed'] * 100 / $info['content_length']), 2, '.', '') . '%';

  $x = $info['files'];
  unset($info['files']);
  $info['files'] = $x;
}

echo @json_encode($info);

?>
Acrescentei alguns itens no array de informações, que originalmente não existem nas que o PHP cria, como o cronômetro do upload, as informações de tamanho total e já enviado em um formato mais legível, e a porcentagem do total de dados já enviados.

Você pode customizar os arquivos, adicionando estilos CSS, eventos JavaScript, valores de retorno JSON, enfim, o que sua criatividade e necessidade exigirem. O essencial está na variável de sessão que está declarada no arquivo upload.php e no campo hidden declarado no formulário. São eles que tornam possível o monitoramento do progresso do upload no PHP 5.4.0 ou superior.

Como verificar se a pessoa curtiu sua fan page no Facebook

Se você já reparou que há fan pages no Facebook que permitem o acesso a certos conteúdos somente para quem clicou no botão "curtir" da página, mas sempre quis implementar isso nas suas páginas, pois saiba que este é um processo bem simples.

O Facebook envia a você um cabeçalho chamado "signed_request", que é codificado em base64. O que é preciso fazer é decodificar este string, e a função abaixo faz o processo.
function parsePageSignedRequest() {
 if (isset($_REQUEST['signed_request'])) {
  $encoded_sig = null;
  $payload = null;
  list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
  $sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
  $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
  return $data;
 }

 return false;
}

Depois, em qualquer lugar do código HTML da sua página, execute o seguinte condicional abaixo. Dentro do if e do else, exerça sua criatividade, mostrando ou ocultando o que você quiser aos fãs, ou que ainda não são fãs, de sua página.
if (($signed_request = parsePageSignedRequest())) {
 if ($signed_request->page->liked) {
  echo "Obrigado por curtir nossa página! Receba informações exclusivas através do Facebook!";
 } else {
  echo 'Curta nossa página para receber informações exclusivas!';
 }
}

is_utf8 - Como verificar se um string está codificado em UTF-8

Quando você usa uma mescla de arquivos PHP com envios de formulários usando jQuery.ajax(), é quase impossível precisar quando o envio dos dados é feito pelo usuário através do submit normal da tag FORM ou se vem através do JavaScript.

Como o jQuery converte os dados do formulário para o formato UTF-8 antes de enviá-los, é necessário usar a função utf8_decode para utilizar os dados do formulário enviados.

Como, às vezes, pode haver arrays extensos, com muitos itens e índices, há duas funções interessantes para resolver esse problema, e são a solução para muitas dores de cabeça.
function is_utf8 ($str) {
    $len = strlen($str);

    for ($i=0; $i<$len; $i++){
        $c = ord($str[$i]);

        if ($c > 128) {
             if ($c > 247) return false;
            elseif ($c > 239) $bytes = 4;
            elseif ($c > 223) $bytes = 3;
            elseif ($c > 191) $bytes = 2;
            else return false;

            if (($i + $bytes) > $len) return false;

            while ($bytes > 1) {
                $i++;
                $b = ord($str[$i]);
                if ($b < 128 || $b > 191) return false;
                $bytes--;
            }
        }
    }

    return true;
}

function array_utf8_decode ($a) {
    foreach ($a as $k => $v) {
        $a[$k] = is_array($v) ? array_utf8_decode($v) : (is_string($v) && is_utf8($v) ? utf8_decode($v) : $v);
    }

    return $a;
}

$_POST = array_utf8_decode($_POST);
$_GET = array_utf8_decode($_GET);

Padrões e Metodologias em PHP?

Por que PHP não é a linguagem mais utilizada pelas corporações? Por que muitos desenvolvedores optam por outras linguagens ao invés de continuar ou utilizar PHP?

Questões como estas surgem todo dia, toda vez que alguém começa a programar em PHP. E talvez a resposta mais adequada seja a falta de um padrão, uma especificação forte em cima da linguagem.

PHP é responsável pelo surgimento dos CMS s mais usados no Brasil e no mundo, mas cada um cria seu padrão e alguns nem padrão se quer têm.

Mas o grande pecado do PHP realmente continua sendo uma falta de padrão. Nem precisamos falar da questão de compatibilidade total entre versões, isso não é perfeito em nenhuma linguagem. Mas se compararmos a versão do PHP4 com o PHP5, chegamos à clássica questão de configurar o httpd.conf para o php4 (porta 80) e criar um httpd5.conf para o php5 no apache, assim evitamos que seu site, blog, etc, saia do ar porque você usava a abertura de código
Cito esta porque é a clássica de todo código legado php4.
Alguns puristas podem intervir e dizer que: Assim a linguagem é mais livre, tem maiores chances de crescimento, comunidade, e todas as velhas histórias que cansamos de ouvir em toda discussão.

Claro que sou contra uma grande empresa ser a dona da linguagem, mas temos de admitir que a falta de um dono (livre ou não) gera uma falta de padrão.

Com o lançamento da versão 5.3, comecei a ouvir algumas questões de padronização e um grupo para tais questões se formando no horizonte.

Para efetivar uma melhora nos códigos em PHP, resolvi seguir Walker de Alencar Oliveira, que define no documento: PHP Coding Standards uma padronização para utilização do nosso código php. Siga também as dicas e tente manter-se atualizado e colaborativo.

iMasters
PHP Coding Standards
Blog do Walker de Alencar

Segurança com PHP



PHP não é coisa de moleque!


12 dicas para otimizar seus códigos PHP

É sempre útil ler algumas dicas rápidas para melhorar a sua codificação. Geralmente temos vícios que adquirimos no dia-a-dia que, sem sabermos, tornam o nosso código mais lento.

Seguem abaixo 12 dicas para melhorar o processamento dos seus códigos PHP.

1. Se um método pode ser static, declare-o como static! O desempenho aumenta 4 vezes;

2. Evite utilizar metódos mágicos como __get, __set e __autoload, se possível;

3. require_once() é dispensável e demanda bastante memória;

4. Use caminhos completos (full path) nos includes e requires, pois é gasto menos tempo resolvendo os caminhos do sistema operacional;

5. Se você quer descobrir o tempo em que o script começou a ser executado, é preferível utilizar $_SERVER[´REQUEST_TIME´] do que time();

6. Veja se pode utilizar strncasecmp, strpbrk e stripos ao invés de regex;

7. str_replace é mais rápido que preg_replace, mas strtr é 4 vezes mais rápido que str_replace;

8. Se uma função, como de substituição de strings, aceitar tanto arrays como caracteres simples como argumentos, e se a sua lista de argumentos não é muito longa, considere fazer algumas declarações redundantes de substituição, passando um caractere por vez, ao invés de uma linha de código que aceita arrays como argumentos de busca e substituição;

9. Supressão de erro com @ é muito lento;

10. $row[´id´] é 7 vezes mais rápido que $row[id];

11. Mensagens de erro demandam mais processamento;

12. Não utilize funções dentro de loops, como por exemplo: for ($x=0; $x < count($array); $x). A função count() é chamada todas as vezes que o loop é executado.

Fonte: iMasters

PHP certification: is it worth it?

Excelente artigo de Manuel Lemos, mantenedor do site www.phpclasses.org.

http://www.phpclasses.org/blog/post/78-PHP-certification-is-it-worth-it.html

Por que um designer deveria conhecer PHP?

Esse assunto gera controvérsias. Qual o seu ponto de vista?

http://www.imasters.com.br/artigo/8829