PHP para Iniciantes: Tipos de Dados Primitivos - Recursos

Recursos (resource) é algo que todos precisam para lidar com qualquer tipo de fonte de dados. Pode ser uma stream, um curl, dba, dbase, etc. Tem literalmente uma lista enorme de tipos de recursos que você pode encontrar na documentação oficial do PHP. Pra quem nunca programou, essa tabela pode soar extremamente complexa por ter termos que você pode não conhecer.

E está tudo bem! Não tente entender os tipos pois cada um tem um contexto absolutamente complexo e o ideal é você entender os contextos que geraram os tipos, não o contrário. Mesmo que na tabela informe quais funções geram os respectivos recursos, você realmente vai ter como saber por que raios você precisaria chamar aquela função? Pois é.

Mas o ponto aqui é: você nunca vai gerar um recurso. Sempre terá uma função nativa para gerar pra você. No máximo, você irá utilizá-lo como fonte de dados (seja entrada ou saída).

Como assim, entrada ou saída, Kiko?

Em algum artigo anterior, eu mencionei a possibilidade de manipularmos CSV. Quando digo manipular, digo que podemos tanto ler quanto escrever dados nele. Nesse caso, o tipo de recurso é o stream (para ambos os casos). Eu posso ler linha a linha, escrever uma planilha, etc.

<?php

// stream de leitura (fopen configurado para leitura)
$stream = fopen("/diretorio/minha-planilha-s2.csv", "r"); // r de READABLE = somente leitura
$primeiraLinha = fgetcsv($stream);
fclose($stream); // remove referência da memória

// stream de escrita (fopen configurado para escrita)
$dados = [
    ["Linha 1, Coluna 1", "Linha 1, Coluna 2"],
    ["Linha 2, Coluna 1", "Linha 2, Coluna 2"],
    ["Linha 3, Coluna 1", "Linha 3, Coluna 2"],
];
$stream = fopen("/diretorio/minha-planilha-s2.csv", "w"); // w de WRITEABLE = somente escrita
fputcsv($stream, $dados);
fclose($stream);

// stream de leitura e escrita
$stream = fopen("/diretorio/minha-planilha-s2.csv", "w+");
// ....

Obs.: para os recursos que precisam acessar dados em disco, é preciso revisar as permissões de acesso fornecidas ao webserver pelo sistema operacional. No caso de rodar o PHP pela linha de comando, o seu usuário precisa ter acesso aos arquivos. Um sudo nesses casos resolve, porém não é recomendado.

Garbage Collector

A grande questão sobre esse tipo de dado é que ele não é um dado real na memória do interpretador, apenas uma referência para a fonte de dados em si. Se essa referência for atribuída a uma variável, então essa conexão à fonte permanecerá ativa até que a variável seja eliminada. Esse processo é feito pelo Garbage Collector.

E o que é isso, Kiko?

É um coletor de lixo, ué. /hehe Várias linguagens desenvolvem esse carinha apenas para tirar da memória qualquer coisa que não vai ser mais útil. Dessa forma, podemos ocupar aquele espaço com algo mais útil.

E tem isso em PHP?

Claro! Só que o Garbage Collector é tão automatizado que ninguém nem percebe, enquanto em outras linguagens você precisa limpar manualmente em todos os cenários.

Quando sua variável chega em um escopo que não é mais acionada, o interpretador vai lá e apaga a referência automaticamente, limpando a memória na mesma hora.

PORÉM, ENTRETANTO, TODAVIA, isso não é necessariamente válido para todos os recursos. Tem até um alerta lá na documentação: o Garbage Collector não remove bancos de dados persistentes. É a mesma coisa que atribuir um recurso a uma constante: a referência vai ficar fixa na memória até que você limpe manualmente!

Como assim, Kiko?

Vamos às analogias. Imagine que você é o interpretador do PHP que usa várias canetas - referência de tinta, que é o dado que você "imprime" - para escrever alguma coisa - o resultado do script. Quando acaba de escrever, você pega todas as canetas que usou, coloca no canto da mesa e vai ao banheiro. Daí vem sua tia (Garbage Collector) e joga no lixo.

Nos casos de canetas que realmente tem sua utilidade exaurida rapidamente, isso faz sentido. Mas e as canetas Bic que duram meses? (Alou, não tô sendo pago pra essa propaganda não hein) Você provavelmente vai brigar com ela, rs. Então aparece a brilhante ideia de fixar as canetas na mesa com aquelas correntes de segurança que vemos em bancos e lotéricas. O único problema aqui é: essa caneta só vai pro lixo quando você desparafusar! Sua tia não vai mais mexer do nada, mas você também vai precisar fazer esse esforço de ir lá remover.

É mais ou menos isso.

Mais um ponto de atenção

Quando falamos sobre configuração do PHP, tem uma aplicação bem interessante chamada JIT, que significa Just In Time. Com isso, nós conseguimos "compilar" algumas coisas para deixar o interpretador ainda mais rápido, deixando boa parte da execução preparada na memória. Chamamos essa parte de bootstrap, que é tudo que há de comum entre todas as execuções do seu projeto, para não ter de ficar reprocessando a mesma introdução toda vez.

O que isso tem a ver com recursos, Kiko?

Tudo. Se parte das execuções vão estar prealocadas na memória, é certo dizer que você vai precisar controlar o Garbage Collector se quiser manter uma boa performance. Usar estratégias como Singletons pode ser um bendito tiro no pé. Tudo isso precisa ser verificado para não acumular referências na memória de forma desnecessária.

Dito isso, não estou dizendo que é errado usar nada do que mencionei no parágrafo anterior. Apenas que é preciso estar atento pra não tomar uma rasteira do sistema operacional de repente, beleza?

E é isso! Esse tipo de dados primitivos realmente não tem nenhuma conversão (nem faz sentido isso né?) e acaba deixando o artigo bem curtinho. Pode comentar se ficou com alguma dúvida e vamos nessa para os próximos capítulos!

Inté!