Expires no Apache - Cache de arquivos no navegador

Resumo:
performance

O ambiente Web é caracterizado pelo modelo requisição/resposta através do protocolo HTTP. Sabendo que alguns conteúdos enviados do servidor para o cliente (navegador) são estáticos, ou mudam com pouca frequência, é possível utilizar um mecanismo de cache para evitar requisições repetidas ao mesmo arquivo. Isso é muito útil, por exemplo, para ser aplicado em imagens e folhas de estilos.

Nohup

Resumo:

Quando trabalhamos com sistemas de informação, existem momentos em que precisamos executar scripts que demoram muito tempo. Seja para corrigir algum erro do sistema, seja para realizar um processamento demorado em função do volume de dados. Nestes casos, não é recomendado deixar estas operações acessíveis via Web, já que o usuário final normalmente não está interessado em esperar mais que um minuto para obter o resultado de um processamento.

Podemos fazer um script para ser executado na linha de comando (shell) usando php-cli, mas executá-lo diretamente também recai sobre o mesmo problema: quem quer ficar esperando o script terminar?

Obter o IP do cliente pelo PHP

Resumo:

Em PHP, existem alguns recursos úteis para se tentar obter o IP do cliente. O processo é feito basicamente observando algumas variáveis guardadas no array superglobal $_SERVER. O maior problema é que o cliente pode estar por trás de um ou mais proxy. A função abaixo tenta obter o IP por diferentes vias:

Layout com Sombras

Resumo:
Introdução

A linguagem CSS 3 ainda não está 100% pronta. Porém, ela é modular, e alguns módulos já possuem algumas especificações interessantes e já suportadas por alguns navegadores.

Algumas das especificações mais atraentes são as sombras em elementos e as sombras em textos. Estes efeitos são feitos pelas propriedades box-shadow e text-shadow respectivamente.

Máscaras Binárias no PHP

Resumo:
Introdução

Máscara binária (máscara de bits ou "bit mask") é um mecanismo usado para armazenar vários valores booleanos em um único campo inteiro e recuperá-los individualmente ou em grupo.

Normalmente, as linguagens de programação que possuem o tipo booleano (bool ou boolean) utilizam um byte (oito bits) para armazená-lo. Apesar de um booleano só precisar de um bit, o byte é usado porque ele é a unidade base das arquiteturas de computadores. Normalmente utiliza-se o valor 00000000 para representar "falso" e o 00000001 para representar "verdadeiro", ou seja, apenas o último bit tem significância.

Logo, para armazenar (por exemplo) 14 valores booleanos, seriam necessários no mínimo 14 bytes. Se estes 14 booleanos fossem armazenados em um inteiro (que normalmente possui 32 bits, que são 4 bytes), usaria apenas 4 bytes.

Gerar Sequências Randômicas no PHP

Resumo:

Eventualmente, é preciso gerar sequências randômicas em sistemas de informação. Alguns exemplos comuns são: geração de arquivo ou diretório com nome único; geração de sal para senhas; geração de chaves de sessão; geração de textos para captcha; etc.

Para tanto, a forma mais comum de se gerar uma sequência randômica é utilizando a função rand ou a versão melhorada dela, chamada mt_rand. Ambas funcionam da mesma maneira. Particularmente, não sei por que criaram outra função para o mesmo propósito, em todo caso, melhor usar mt_rand.

Autenticação e Criptografia de Senhas com PHP

Resumo:
Introdução
cadeado

É comum que sistemas de informações utilizem um mecanismo de autenticação para acesso às ferramentas restritas através de um login e senha. Por questões de confidencialidade e segurança, é comum, também, que as senhas fiquem guardadas de forma criptografada no banco de dados. Os algoritmos de criptografia usados para estes casos são aqueles de via única (unidirecional), ou seja, que não permitem que um valor codificado seja descriptografado facilmente. O nome dado a um valor criptografado também é chamado de "hash".

PHP oferece diferentes alternativas para criptografar uma senha. Cada uma delas pode ter suas peculiaridades na hora de se montar o mecanismo de autenticação. Vejamos algumas das principais funções usadas para criptografia de senhas:

  • md5 - Gera uma sequência binária de 16 bytes (ou 32 símbolos hexadecimais)
  • sha1 - Gera uma sequência binária de 20 bytes (ou 40 símbolos hexadecimais)
  • crypt - Gera um hash de acordo com um algum algoritmo escolhido (poucas opções)
  • hash - Módulo que oferece diferentes algoritmos de criptografia (para saber os disponíveis, basta usar hash_algos)
  • mcrypt - Módulo que oferece diferentes algoritmos de codificação/decodificação (para saber os disponíveis, basta usar mcrypt_list_algorithms)
  • mhash - Módulo obsoleto por hash.

Manipulando ASCII-85 via PHP

Resumo:

ASCII 85 é uma forma de codificação de sequências binárias que utiliza 85 caracteres imprimíveis. O valor codificado fica aproximadamente 25% maior que o valor original. Por questões de comparação, o "base 64" deixa o valor codificado aproximadamente 33% maior que o valor original.

Interfaces em PHP

Resumo:

"Interface", no Paradigma Orientado a Objetos, representa uma estrutura que especifica um conjunto de métodos que uma família de classes terá. Nesta especificação são informados os nomes dos métodos, visibilidade e os respectivos parâmetros, mas nenhum deles são implementados na interface. Diz-se que uma classe "implementa" uma interface quando ela possui os métodos previstos na interface e declara, explicitamente, implementá-la.

Classe DateTime do PHP sensível à localidade

Resumo:

Um dos inconvenientes da classe DateTime é que ela consegue formatar datas apenas em inglês, diferente da função strftime, que tem seu comportamento afetado pela localidade definida na função setlocale.

Para resolver este problema, criei uma classe chamada MyDateTime, que estende a classe DateTime e oferece algumas funcionalidades adicionais como os métodos:

  • alternateFormat - Para formatar uma data com o formato aceito por strftime.
  • getWeekNames - Obtém os nomes dos dias da semana.
  • getShortWeekNames - Obtém os nomes dos dias da semana abreviados.
  • getMonthNames - Obtém os nomes dos meses do ano.
  • getShortMonthNames - Obtém os nomes dos meses do ano abreviados.

Instalação de Módulos Pear e Pecl

Resumo:
PECL & PEAR

Pear (PHP Extension and Application Repository) é um sistema de pacotes para PHP que oferece ferramentas de alto nível para instalação, remoção ou atualização de pacotes. Basicamente, Pear oferece bibliotecas de código PHP para solução de problemas específicos, como geração de PDF, geração de imagens, manipulação de ID3 de MP3, etc.

Além disso, Pear possui um repositório chamado Pecl (PHP Extension Community Library), que é voltado para a instalação de extensões compiladas do PHP. A versão 5 de PHP é escrita em linguagem C, e foi proje­tada para incorporar novos módulos escritos em C. Com isso, é possível escrever e/ou utilizar código de alta performance para ser utilizado por scripts em PHP. Nada impede um programador de criar suas ferramentas usando a própria linguagem PHP, porém, como PHP não oferece recursos como ponteiros de C, alguns tipos de operações podem se tornar mui­to mais lentas.

Aritmética de Horas em PHP

Resumo:
Alterando as Horas

Outro dia falamos de aritmética de datas. Porém, aritmética de horas pode ser um pouco diferente. O motivo é que as vezes queremos obter um acumulado de horas, que ultrapassa 24 horas, mas que queremos o valor absoluto de horas.

Consultar Classes, Interfaces, Funções, Variáveis e Constantes do PHP

Em PHP existem 5 funções que conseguem obter a lista de classes, interfaces, funções, variáveis ou constantes declaradas até o momento. São elas:

  • get_declared_classes - Para obter as classes disponíveis;
  • get_declared_interfaces - Para obter as interfaces disponíveis;
  • get_defined_functions - Para obter as funções disponíveis;
  • get_defined_vars - Para obter as variáveis definidas;
  • get_defined_constants - Para obter as constantes definidas.

As interfaces Iterator, ArrayAccess e Countable do PHP

Resumo:

Interface é um recurso das linguagens de programação orientadas a objetos que propicia algumas vantagens ao polimorfismo. PHP oferece algumas interfaces que, caso sejam implementadas em uma classe, resultam em comportamentos especiais. Algumas destas interfaces são: Iterator, ArrayAccess e Countable.

Array com tamanho fixo no PHP (SplFixedArray)

Resumo:

PHP oferece nativamente o tipo array, que possui bastante flexibilidade. As principais características do array de PHP é que ele permite índices inteiros ou alfanuméricos, e é auto-redimensionável, ou seja, cresce ou diminui conforme elementos são adicionados ou removidos.

Quem já trabalhou com linguagens mais baixo nível, como C ou C++, deve saber que manter o controle sobre um array auto-redimensionável implica em perda de performance em função da realocação de memória. Para prover uma solução mais restrita e mais rápida para PHP, foi criada a classe SplFixedArray, disponível a partir da versão 5.3 de PHP. Ela só aceita inteiros como índices (de zero até o tamanho menos um) e tem tamanho fixo (definido na criação do objeto), embora possa ser redimensionado a qualquer momento. Quanto menos redimensionamento é feito, mais ela tende a ser mais rápida que um array convencional.

Alternativa para money_format do PHP

Resumo:

O script a seguir é destinado àqueles que utilizaram a função money_format no Linux e ficaram decepcionados ao notar que a função não estava disponível para Windows. Criei este script para tentar simular o comportamento da função original. Entretanto, nem todas as opções foram implementadas. Caso queira ajudar, fique a vontade, pois o código é livre e gratuito.

var_dump para classes e objetos do PHP

Resumo:

As funções var_dump, print_r e debug_zval_dump são úteis para destrinchar o conteúdo de uma variável em PHP, independente de seu tipo.

Porém, elas não mostram, por exemplo, os métodos de um objeto. Uma forma simples de se obter esta informação é utilizando o método export da classe Reflection.

Percorrer Diretórios e Arquivos com PHP

Resumo:
Busca em Diretório

Percorrer diretórios e arquivos em PHP é muito simples. Vamos ver 5 formas para se fazer isso, cada uma com suas características e limitações:

Aritmética de Datas com PHP

Resumo:
Introdução
Calendário

Aritmética de datas é o processo de realizar contas utilizando datas e intervalos de tempo.

O fator mais complicante nestes tipos de operações é que data não é algo tão exato quanto se imagina. Tudo por conta que a Terra leva 365,2422 dias para completar uma volta inteira no Sol. Para entender com detalhes, leia esta explicação.

Heredoc e Nowdoc do PHP

Resumo:

Heredoc e Nowdoc (também chamados de "here document" e "now document") são duas formas de se representar strings em PHP (assim como existe a representação usando delimitadores com aspas simples e com aspas duplas).

Construções da Linguagem PHP

Resumo:

A linguagem PHP, assim como qualquer linguagem de programação, é formada por construções da linguagem. Além das estruturas básicas de programação (estruturas condicionais, estruturas de repetição, sintaxe para criação de classes, sintaxe para criação de funções, etc.), a linguagem possui algumas funções "built-in", ou seja, funções embutidas no núcleo da linguagem.

Cuidados com o Modelo Entidade-Relacionamento

Resumo:

Modelo Entidade-Relacionamento é a conhecida modelagem da base de dados com suas entidades, atributos e relacionamentos.

A princípio, parece um modelo bastante simples de se fazer quando nos concentramos na realidade. Ou seja, se os atributos de cada entidade e os relacionamentos das entidades são realmente condizentes com a realidade em qualquer circunstância. É importante se preocupar com os nomes dados às entidades e os pontos onde elas podem ser quebradas para evitar a duplicação de dados.

Existe, porém, um detalhe que observei recentemente: parece existir uma tendência natural do modelador ligar algumas entidades às entidades que representam pessoas ao invés de ligá-las onde realmente preservaria a integridade referencial.

"Foreach" vs. "For" em PHP

Resumo:
performance

Hoje, em uma discussão em uma lista de PHP, fui surpreendido com a informação de que a estrutura "for" era mais rápida que a estrutura "foreach". Depois me deram a fonte da informação: The PHP Benchmark. Na fonte, diz que o "for" é mais rápido para escrita, mas é mais lento para leitura dos elementos percorridos. Observando o código do site, cheguei a conclusão de que ele estava meio furado.

Controle de Erros em PHP

Resumo:

Tratamento de erros é a estratégia usada para capturar a ocorrência de uma situação que impede o sucesso de uma operação do sistema. Isso pode se dar em diferentes níveis. Em baixo nível: uma função pode receber um parâmetro inesperado. Em alto nível, uma ferramenta pode não aceitar determinada sequência de ações do usuário.

Entendendo o Unicode e UTF-8

Resumo:

Se você trabalha com programação Web, provavelmente já utilizou a codificação de caracteres Latinos (ISO-8859-1) e conhece ou já deve ter ouvido falar de Unicode. Este artigo mostra o que é Unicode, quais os benefícios e como trabalhar com ela.

Tarefas agendadas via Cron + PHP

Resumo:

Em sistemas de informação, é comum existirem atividades que precisam ser realizadas sob agendamento. Normalmente esta característica é necessária por um dos motivos:

  1. porque a tarefa precisa ser executada em determinado instante para prover informações a partir daquele momento;
  2. porque a tarefa é muito demorada e é inviável que o usuário que a invoque fique esperando até que ela termine.

Conhecendo o PDO do PHP

Resumo:

O que é PDO?

PDO (PHP Data Objects) é um módulo de PHP montado sob o paradigma Orientado a Objetos e cujo objetivo é prover uma padronização da forma com que PHP se comunica com um banco de dados relacional. Este módulo surgiu a partir da versão 5 de PHP. PDO, portanto, é uma interface que define um conjunto de classes e a assinatura dos métodos de comunicação com uma base de dados.

Cada sistema gerenciador de bancos de dados (SGBD) pode prover um driver para PDO. Apesar de PDO definir a assinatura dos métodos que cada driver deve implementar, alguns recursos podem não ser suportados. Logo, a chamada a um método pode ser "inútil" dependendo do driver utilizado ou da versão/modelo do servidor de Banco de Dados. Por exemplo, algumas engines do SGBD MySQL não dão suporte a transações, logo, o método "beginTransaction" (responsável por iniciar uma transação) simplesmente não terá efeito sob tais condições.

Script PHP com Dados Binários

Resumo:

Existe um mecanismo do PHP que permite embutir trechos de dados (inclusive dados binários) que não serão sequer interpretados pelo interpretador de PHP. Diferente do comando "exit", que interrompe a execução do script, mas não interrompe o parser do PHP, existe o comando "__halt_compiler", que ignora absolutamente tudo que esteja abaixo do ponto em que foi chamado.

Fisl

Para quem se interessa por software livre, taí o Fisl 11. Como sempre, em Porto Alegre. Desta vez vou para apresentar duas palestras.

Link: Fisl 11

Layout em PHP

Resumo:

Apesar de gostar e apoiar o PHP, não gosto de uma de suas características mais marcantes: o fato de ser uma linguagem "embutida" no HTML. Ou seja, a linguagem possui delimitadores de código e tudo que fica fora dos delimitadores são considerados blocos de texto que devem ser enviados diretamente para saída padrão (normalmente um código HTML).

Data Warehouse

Resumo:

Data Warehouse é um sistema de computação que guarda dados de uma organização. Os dados vão desde nomes de departamentos/setores, até os dados referentes às atividades da organização, ou seja, dados referentes ao nível operacional. Por exemplo, em um sistema para uma universidade, o sistema data warehouse provê, dentre outras coisas, informações sobre as aulas (notas, rendimento dos alunos, participação dos docentes, etc.), ou seja, o nível mais operacional da universidade.

Metaprogramação em PHP

Resumo:

Com PHP, você consegue criar um código que gera outro código, afinal, um script PHP é um arquivo texto.

Mas a linguagem também permite que um script consiga alterar seu próprio comportamento em tempo de execução. Isso pode ser útil para otimizar trechos de código. Este recurso é possível com o comando "eval".

Zend Certified Engineer - PHP

Resumo:

Zend Certified Engineer (ZCE) é o título dado às pessoas que foram aprovadas no exame de certificação oferecido pela empresa Zend, que mantem a linguagem PHP. Existe a certificação de PHP 5 e do Zend Framework.

Ainda existem menos de 100 pessoas certificadas em PHP 5 no Brasil. Porém, o título é uma forma de comprovar um certo domínio do profissional sobre a linguagem. Isso ajuda empresas a selecionar candidatos.

Callback em PHP

Resumo:
Introdução

Callback é um mecanismo utilizado por uma linguagem para que uma função seja transmitida na forma de parâmetro para outra função. Uma função com comportamento genérico recebe um callback por parâmetro e usa a função callback para realizar as operações específicas. Desta forma, é possível utilizar a função de diferentes formas.