O WebDeveloper que Utiliza PHP :: Caminho

PHP é a linguagem de programação web server-side mais utilizada a nível Mundial e neste artigo vão ser retratados os aspectos que devem fazer parte do estudo, do caminho de um WebDeveloper que quer desenvolver em PHP. Entre eles Boas práticas, Frameworks, Segurança, Caching, Buffering e Environments.

O Melhor Amigo – PHP Manual

Antes de mais é necessário aprender a linguagem em si, e o PHP é uma linguagem com uma enorme comunidade por trás que desenvolveu o PHP Manual, neste manual encontra-se todo o conhecimento necessário para se dominar a linguagem PHP. E como se não chegasse a sua enorme qualidade este é, também, gratuito e pode ser acedido quer online quer offline.

De leitura fácil encontramos no PHP Manual a documentação de como proceder à sua instalação e configuração, a documentação da estrutura lógica da linguagem bem como de todas as funções que a compõe sem nunca faltarem imensos exemplos! A secção das notas dos utilizadores é riquissima em estudos e desenvolvimentos de cada função, não dispensem a sua leitura!

Aceder ao PHP Manual em Português

Montar um Ambiente de Teste

Para testar o PHP não é necessário apenas ter um editor de texto e um browser, é necessário um servidor que corra o interpretador de PHP.

Então para começarmos a desenvolver em PHP é necessário configurar um pequeno servidor ou então utilizar um host existente…

Existem soluções que não envolvem muito trabalho nas configurações, como o MAMP (Mac), WAMP (Windows), LAMP (Linux), estas ferramentas já trazem também incluido a SGBD (Sistema de Gestão de Base de Dados) MySQL.

Depois para desenvolver o código pode utilizar ferramentas de auxilio, os IDE’s. A SmashingMagazine realizou um estudo comparativo sobre IDE’s para PHP. Ver Estudo Comparativo de IDE’s para PHP Aqui

Para quem não quer editores tão pesados aconselho o Geany (Linux) ou Notepad++ (Windows).

Desenvolver Bom Código

Isto não é algo restrito ao PHP mas a todas as linguagens de programação.

Quando programamos algo deve ter, além de uma estrutura lógica e funcional correcta, uma boa identação, documentação e deve também ser auto-explicativa (variáveis, classes e funções com nomes que descrevam facilmente o que contêm / o que fazem).

Deve ser fácil de ler e entender quer pelo próprio programador daqui a uns anos ou por outro programador que tenha de modificar algo no código desenvolvido.

Manter Funções Fora de Ciclos

Manter sempre a declaração de funções fora de ciclos é um aspecto muito importante quando visamos a performance de uma aplicação desenvolvida em PHP pois num ciclo que se repete (imaginemos) 500 vezes, a função será declarada 500 vezes, uma perda de tempo.

Organização do Código por Ficheiros

Além da organização ao nível das linhas código em si temos a organização de código relativa à separação por ficheiros e categorias. Para facilitar o entendimento e a detecção e correcção de erros o código deve ser separado lógicamente.

Imaginemos que estamos a desenvolver um CMS (Content Management System). E então devido à grande quantidade de código que tem de ser desenvolvido vamos separar o código em vários ficheiros.

Má Prática

Má Prática - Organização Ficheiros

Boa Prática

Boa Prática Organização Código

Aprender Object Oriented Programming

Object-oriented programming (OOP) ou Programação Orientada a Objectos (POO) em Português utiliza objectos para representar partes da aplicação permitindo separar em secções lógicas o código, facilitando a sua modificação e organização.

Aprender a Utilizar uma Framework

Muitos defendem que se deve aprender a utilizar frameworks na iniciação ao PHP porque com elas se aprende a desenvolver código mais avançado, a organizar melhor o código, a torná-lo lógico, a fazer debbug de erros, etc.

Outros defendem que não se deve aprender a utilizar frameworks na iniciação ao PHP porque no inicio o que os utilizadores necessitam é fazer os seus erros, aprender a desenvolver o seu código de raíz, sem funções e classes prontas a utilizar (exceptuando aquelas que vêm de raíz no PHP claro).

Eu considero que o utilizador deve dar uma olhadela a algumas frameworks e decidir se as deve ou não utilizar, porque cada pessoa é unica e pode aprender de diversas formas. Frameworks que considero muito bem estruturadas: Kohana, CodeIgniter e CakePHP .

Nunca Confie nos Utilizadores

Um dos aspectos mais importantes ao nível da segurança de aplicações informáticas é nunca confiar nos utilizadores da aplicação que estamos a desenvolver.

E que implica isso? Validar tudo o que entra! URL’s, formulários, cookies, sessões e até headers dos browsers.

Vamos então ver alguns exemplos de validações pois seria impossível cobrir todas as validações possíveis.

Validar Dados

É muito importante validar e corrigir todos os dados que possam ser introduzidos pelo utilizador! Infelizmente tenho visto imensas aplicações web sem qualquer protecção contra ataques tornando-as completamente vulneráveis a ataques.

Imaginemos o seguinte URL: joaopedropereira.com/xpto.php?id=1245

Que falha pode ser explorada aqui? O parâmetro dado ao id que pode ser utilizado para um SQL Injection por exemplo. Como fazer esta validação? Através de Regex:

function is_natural($str){
return (bool)preg_match( '/^[0-9]+$/', $str);
}

if(is_natural($_GET['id'])) { /* código */ }
else die('Erro');

Outro exemplo também com URL: joaopedropereira.com/xpto.php?email=email@domain.tld

function is_email($str){
return (preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? TRUE : FALSE;
}

if(is_email($_GET['email'])) { /* código */ }
else die('Erro');

Também com formulários se deve proceder de uma forma semelhante a esta.

ID Cliente

Email

function is_natural($str){
return (bool)preg_match( '/^[0-9]+$/', $str);
}
function is_email($str){
return (preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? TRUE : FALSE;
}
if(is_email($_POST['email']) AND is_natural($_POST['id'])) { /* código */ }
else die('Erro');

Vimos então que se podem validar os dados através de Regex mas existem outras formas de o fazer.

Imaginemos que temos um formulário que envia um campo de texto. Não podemos criar uma função em Regex para o efeito, assim temos de utilizar outras funções mais ou menos complexas para fazer a limpeza destes dados (recomendo o estudo das funções de validação da Kohana ou CodeIgniter).

function proteger($str) {
$str = strip_tags($str);
$str = mysql_real_escape_string($str);

return $str;
}

Com esta função adicionamos alguma segurança ao nosso código limpando tags como as utilizadas em ataques XSS e limpamos os dados contra SQL Injection. (Atenção: esta função não inibe todos os ataques apenas os dificulta um pouco).

Existe também uma forma de melhorar a segurança que dá menos trabalho pois apenas com algumas linhas de código podemos limpar todos os dados passados por $_POST, $_GET, $_REQUEST, $_COOKIE, $_SESSION, etc.

Eu normalmente crio um ficheiro que incluo no inicio de cada página parecido com o seguinte:

foreach ($_POST as $key => $value) {
$_POST[$key] = proteger($value);
}

foreach ($_GET as $key => $value) {
$_GET[$key] = proteger($value);
}

foreach ($_REQUEST as $key => $value) {
$_REQUEST[$key] = proteger($value);
}

foreach ($_COOKIE as $key => $value) {
$_COOKIE[$key] = proteger($value);
}

foreach ($_SESSION as $key => $value) {
$_SESSION[$key] = proteger($value);
}

Ambiente de Teste vs. Ambiente Real

Um dos problemas com que me deparava quando me iniciei no desenvolvimento de aplicações web em PHP (como o tempo passa…) era a mudança de variáveis entre o ambiente de teste e o real, como por exemplo as configurações da base de dados…

Até ter adoptado uma metodologia que me permitia ao alterar apenas uma linha alternar entre os ambientes.

define('LIVE', true);

if(LIVE) {
error_reporting(0);
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'basededadosxpto');
} else {
error_reporting(E_ALL);
define('DB_HOST', 'joaopedropereira.com');
define('DB_USER', 'joao');
define('DB_PASSWORD', 'pedro');
define('DB_DATABASE', 'joao_basededados');
}

Com esta metodologia só preciso de modificar a linha que define a constante LIVE como true ou false conforme esteja a trabalhar num ou noutro ambiente, podem também verificar ali a alteração do error_reporting, enquanto no caso do Ambiente Real não quero que sejam mostrados nenhuns erros aos visitantes por questões quer de segurança quer de aspecto, no caso do Ambiente de Teste quero saber todos os pormenores.

Utilizar Output Buffering

Utilizar Output Buffering é uma excelente maneira de optimizar a performance de uma aplicação em PHP. Sem Output Buffering a sua aplicação só vai mostrar o HTML no fim de toda a página estar carregada, com o Output Buffering a sua aplicação mostra o HTML já carregado quando o programador ordena!

O Developer Brian Cray criou um artigo muito interessante sobre este assunto para a DevTips. Veja-o aqui.

Utilizar Sistemas de Caching

Os Sistemas de Caching são interessantes para aumentar a performance de uma aplicação em PHP. No entanto há que ter em atenção alguns aspectos como por exemplo numa amostragem de resultados em tempo real não se podem utilizar sistemas de caching ou então teremos dados desactualizados…

Existem sistemas prontos a usar mas também podemos desenvolver o nosso sistema de caching como por exemplo algo do género:

$cache_file = 'cache_files/' . md5($_SERVER['SCRIPT_URI']);
$cache_time = 1200 * 60; //60min*6 * 60 segundos (6HORAS)

if(file_exists($cache_file) AND is_readable($cache_file) AND (time() - $cachetime < filemtime($cache_file))) {
require_once($cache_file);
} else {
ob_start();

/* o código do ficheiro */

$file = fopen($cachefile, 'w');
fwrite($file, ob_get_contents());
fclose($file);

ob_end_flush();
}

Sistemas de Caching:

Eu não mordo...

Não tenha medo de comentar, não tenha medo de perguntar, de criticar ou elogiar! Qualquer dúvida pergunte, qualquer reparo faça-o, todas as opiniões e comentários são bem vindos aqui no blog.

Pode também divulgar o artigo, eu não acuso ninguém que divulgue o meu artigo nas diversas redes sociais ou nos próprios blogs (mencionando a fonte ou autor) de plágio :).

    7 comments

    1. Já que ninguém morde… 😀

      Gostei muito do artigo no geral, e apenas venho cá deixar umas opiniões sobre os assuntos colocados.

      Quanto à questão das frameworks, acho que é essencial a pessoa dominar e perceber bem o funcionamento do PHP antes de se iniciar com uma framework. Pode haver casos em que uma framework não é necessária, por exemplo, um website estático, apenas com um pequeno formulário de envio de mails. Já tendo conhecimentos de utilização de frameworks com certeza que ajuda, mas aposto que ainda irão ser necessárias umas visitas ao manual do PHP, até pelas (possíveis) diferenças de sintaxe.

      A validação de dados, também queria deixar uma função muito simples e interessante que encontrei no P@P, que tem como efeito proteger os dados vindos das variáveis POST e GET (e quaisquer outras):
      http://www.portugal-a-programar.org/forum/index.php/topic,27652.html

      Boa continuação com os artigos! 😉

    2. Muito interessante o artigo. Numa maneira geral sigo as medidas aqui propostas para desenvolvimento em PHP. Uma vez mais estás de parabéns. Gosto de ver alguém partilhar os seus conhecimentos com os que estão a aprender. Continuação de bom trabalho 😉

    3. Interessante o artigo. Parabéns!

      Aprendi mais algumas coisas, é sempre bom ler dicas e metodologias de alguém que realmente estudou programação, no caso de um auto-didacta, algumas vão se aprendendo com os erros, outras simplesmente não se aprendem sem estudo.

      Obrigado.

      Tendo em conta a minha experiência pessoal, uma boa forma de aprender é pegar numa simples / mediana aplicação opensource, se possível que abranja o maior número de possibilidades na programação (funções, loops, etc) e tentar ir mais além com ela. Acho que ajuda imenso.

      Em relação ao error reporting, eu tenho-o activado (para poder ter conhecimento via o log de algum problema) no entanto, tenho o ini_set(“display_error”, 0) para os users além de mim.

      Abraço!

    4. Boas.
      Quero começar por dizer que me estou a iniciar na arte da programação e que é muito provável que as minhas dúvidas sejam muito básicas =)

      Quanto ao artigo gostei. Estou à procura de material que me possa ajudar a aprender e a desenvolver a minha arte, e o artigo é bastante interessante.

      Agora a pergunta básica. O que faz mesmo uma framework? lol
      Eu estou interessado em conseguir fazer tudo “à lá pata”, como costumo dizer, mas no entanto quero também tomar conhecimento e aprender sobre as ferramentas que nos podem ajudar a desenvolver códigos mais complexos, e como tal quero saber quais a potencialidades disso.

      Parabéns pelo blog.
      Abraço

      1. Viva Miguel,

        Obrigado pelos elogios e é sempre bom ver alguém por cá a querer iniciar-se nesta arte como tu bem lhe chamaste.

        Respondendo à tua dúvida, uma framework é uma base para realizares um trabalho pois é um conjunto de funções/classes básicas como por exemplo, sistema de templates, validações de segurança, sistemas de parsing, suporte multi-lingua, etc.

        Abraço,
        João Pedro Pereira

    5. Boas.

      Quero desde já, dizer que gosto mesmo destes sites / blog’s em que explicam bem as coisas sobre a qual estão a falar..
      Eu ando a tirar um curso de informática, e lá damos é visual basic.
      Na disciplina de redes demos html, javascript e um pouco de php…e desde ai tenho vindo a procurar informação sobre php porque gostei do que se pode fazer…
      Comecei a fazer um sistema de registo e login e procurando na net consegui ao fim de algumas tentativas porque em alguns sites metem para lá o código e nem explicam nada…uma pessoa que não perceba o código fica na mesma…
      e agora ando à procura ( nem sei como explicar mas vou tentar ) :
      Fazemos o registo e ao fazer login cada pessoa tem a sua pagina ( ex: facebook ) página de perfil, e gostava de saber se me podias ajudar nisso sff , visto que está mesmo complicado encontrar na net..que explique decentemente..

      Se for possível ajudar-me agradecia, se não …não faz mal porque percebo, que estou a dar trabalho xD

      E mais uma vez obrigado pela informação postada aqui.
      Abraço

    Leave a Reply to Pedro MagalhãesCancel reply

    This site uses Akismet to reduce spam. Learn how your comment data is processed.