sexta-feira, 26 de julho de 2013

Persistência de Dados em PHP - Gravação de arquivo em servidor

A linguagem de script ASP fornece a facilidade de persistência de variáveis em uma Sessão de usuário e em toda a aplicação.

O PHP possui a parte de sessão, mas não a de aplicação. Existem alternativas como o módulo Memcache ou Memcached e classes desenvolvidas pela comunidade. Mas como as aplicações são muito diversificadas, e nem sempre você possui um profissional de suporte disposto a instalar complementos, verificar as dependências e realmente configurar o ambiente PHP da forma correta, escrevemos este artigo para que você tenha uma opção de escolha.

Gravação em arquivo

O PHP oferece funções semelhantes às da linguagem C++ para gravação de arquivos sequenciais. No entanto, existem alternativas de mais alto nível como:

file_put_contents - Grava uma sequência de caracteres em arquivo NO SERVIDOR Web;
file_get_contents - Lê uma sequência de caracteres de um arquivo NO SERVIDOR Web;

As sintaxes serão mostradas nos trechos de código abaixo.

Arrays e Serialização

As sequências de caracteres devem ter uma determinada estrutura, para que mais informação possa ser gravada em uma sequência, e para que o tempo de acesso ao disco compense. Não é eficiente guardar uma variável por arquivo no servidor. Vamos optar por gravar um arranjo inteiro, ou um objeto.

Para simular estrutura dentro de uma sequência de caracteres, optamos pela serialização e desserialização de arranjos. Estas operações são feitas pelas funções:

serialize - Serializa, ou seja, cria a estrutura de pares de conteúdos na base chave-conteúdo em uma sequência;
unserialize - Abre a estrutura de pares de conteúdos na base chave-conteúdo;

As sintaxes serão mostradas nos trechos de código abaixo.

Gerando o arranjo indexado

Arranjos indexados por números tem pouca serventia. O ideal é gerar o índice por algum mnemônico, sigla, ou sequência que vai ser muito usada para consulta:

$arr = array();
$arr["Fco"] = "Francisco da Silva";
$arr["Sam"] = "Samuel de Souza";
$arr["Fnd"] = "Fernando Alves de Souza";

A forma de armazenamento na memória é complexa, mas o serialize compõe uma sequência para gravação que é satisfatória:

$conteudo = serialize($arr);

Ao imprimirmos o $conteudo, ele apresenta a seguinte saída:

a:3{s:3:"Fco";s:18:"Francisco da Silva";s:3:"Sam";s:18:"Samuel de Souza";s:3:"Fnd";s:23:"Fernando Alves de Souza"}

O prefixo a:3 informa que o arranjo possui 3 itens.

Cada string é precedida de uma letra "s" (indicando string ou sequência de caracteres alfanuméricos) seguida de ":" (dois pontos), seguida de um número que indica quantos caracteres a string possui. Ao final de cada informação desta, segue-se um ";" (ponto e vírgula). É como uma tabela de campos em banco de dados.

s:3:"Fco" - Tipo string, tamanho 3, conteúdo "Fco"
s:18:"Francisco da Silva" - Tipo string, tamanho 18, conteúdo "Francisco da Silva"

Gravação em arquivo no servidor Web

$rs = "/var/www/chatonline/result.txt";
file_put_contents($rs,$conteudo);

Uma das simplificações interessantes deste comando é que o descritor do arquivo é o próprio path e nome do arquivo a ser gravado, sem as instanciações cansativas de objetos, transformações de descritores e outras futilidades das linguagens a objeto.

Leitura de um elemento

Um outro programa PHP pode fazer a leitura de um dos elementos deste arranjo gravado, da seguinte forma:

$rs = "/var/www/chatonline/result.txt";
$conteudo = file_get_contents($rs);
$arr = unserialize($conteudo);
echo $arr["Sam"];

o resultado apresentado na tela do browser é:

Samuel de Souza

Em um próximo post, vamos criar uma classe para armazenamento de variáveis de uma aplicação de um cliente pelo seu número IP, ou pelo login, conforme o tipo de escopo. Para intranets, o IP basta. Mas para aplicações de Internet, o melhor é utilizar o login único por pessoa.








Nenhum comentário:

Postar um comentário