Por resultados de BD em cache (PHP/MySQL)

hasta.g5

I quit My Job for Folding
Boas,

Para evitar fazer demasiados acessos a uma base de dados, queria por alguma informação em cache. A primeira ideia que me veio à cabeça foi usando as variáveis de sessão. ($_SESSION['blabla']). Fiz então uma coisa do género:
PHP:
$_SESSION['result'] = mysql_query($query);
Não é exactamente assim, mas, no fim, é como se fosse. Aparece-me então o seguinte erro:
Código:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/www/.......php on line X
Gostava de saber se as variáveis de sessão de facto não suportam estes resultados de querys ou se há qualquer coisa que não esteja a funcionar no meu código que não seja isso.

Caso não suporte, há alguma maneira do género para por a informação em cache? Pensei em usar ficheiros, mas para isso provavelmente mais vale ir sempre à base de dados.

Antes de mais obrigado.
hasta
 
não podes atribuir um array para dentro de outro array.

o que podes é fazer algo do genero :

$result = mysql_query($sql);
$tmp = mysql_fetch_row($result);

$_SESSION['nome'] = $tmp['nome'];
$_SESSION['email'] = tmp['email'];

etc, etc etc ...
 
Para evitar fazer demasiados acessos a uma base de dados, queria por alguma informação em cache. A primeira ideia que me veio à cabeça foi usando as variáveis de sessão. (...) Pensei em usar ficheiros, mas para isso provavelmente mais vale ir sempre à base de dados.
Se investigares verás que os dados das sessões são guardados em ficheiros, normalmente na pasta /tmp, e não na memória do servidor. Se assim fosse, não havia memória que aguentasse e perdiam-se os dados das sessões entre 'restarts' do servidor web. É possível fazê-lo, mas na maior parte dos casos não é desejável.

Concluindo: já estás a trabalhar com ficheiros quando trabalhas com sessões, só que estás a fazê-lo de forma transparente.

Não creio que seja boa ideia estares a enfiar na sessão dados vindos directamente da BD.
Da minha experiência há dois factores que influenciam siginificativamente o tempo de processsamento no servidor de uma página com, por exemplo, uma lista de 100 itens dispostos numa tabela: 1) a selecção dos dados no SGBD e, 2) o dump dos dados para uma ou várias tabelas HTML.
Existem várias abordagens para acelerar este processo. Deixo aqui uma que uso com frequência para listagens de milhares de dados que mudam com frequência.

1. selecção dos dados (SELECT x,y,z FROM w.....)
2. hash MD5 dos dados devolvidos, com uma chave que assegure a unicidade do resultado
3. SE:
3.1 não existe em cache (ficheiro) o resultado já formatado em HTML correspondente à chave MD5, este é gerado no momento e devolvido;
3.2 se já existe, devolve o resultado já paginado e tabulado que está na cache.

Ou seja, não poupo o tempo do SELECT porque preciso de verificar se os dados não foram modificados, mas poupo um 'tempão' (em certos casos, uns segundos) na construção HTML dos resultados.

É apenas uma ideia. Existem outros modelos eventualmente mais apropriados ao que estás a fazer. Para cada caso, descobre a melhor solução dentro das possibilidades.
 
Obrigado a todos. =)
Eu queria por em cache exactamente porque o que aquele query retorna não é mais que 4, 5 valores.
Não sabia que os dados das sessões eram postos em ficheiros. Sendo assim muda tudo.

spastikman: Pois, estava com esperanças que fosse uma espécie de vector de objectos.

slack_guy: Excelente ideia, é exactamente isso que vou fazer. A base de dados só é alterada de mês a mês e precisamente para criar uma tabela de dados que vai servir. Assim o acesso à BD é feito uma vez por mês em vez de ser uma vez por sessão.

Mais uma vez obrigado. =)
hasta
 
Back
Topo