• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Battousai

[PHP] Cache de funções

13 mensagens neste tópico

define( 'PATH_TO_CACHE', '/caminho/para/tmp/' );

function cache_function( $function, $args = array(), $duration = 60 ){

$hash = ( is_array( $function ) ? get_class( $function[0] ) . $function[1] : $function ) . implode( ':', $args );

$cache_file_path = PATH_TO_CACHE . md5( $hash );
$file_time = file_exists( $cache_file_path ) ? filemtime( $cache_file_path ) : 0;

if( $file_time < time() - $duration ){

	$data = call_user_func_array( $function, $args );
	file_put_contents( $cache_file_path, serialize( $data ), LOCK_EX );
	return $data;

}

return unserialize( file_get_contents( $cache_file_path ) );

}

// Funções Normais
echo cache_function( 'funcao', array( 'arg1', 'arg2', 'arg3' ), 3600 );

// Funções de Classes
echo cache_function( array( $objecto, 'funcao' ) );
echo cache_function( array( 'classe', 'funcao' ) );

Já tinha visto uma função qualquer deste género, entretanto perdi-a e resolvi fazer uma com o mesmo propósito.

EDIT: :D

Esta função serve para fazer cache do conteúdo de partes de código gerados por funções.

Sendo assim, é uma maneira de optimizar o vosso código quando querem poupar recursos, guardando o conteúdo gerado por funções num ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para que serve isto?

Já foi adicionada uma explicação sucinta do que faz. :-[
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só tens de ter atenção a uma coisa, no hash. O call_user_function dá para chamar métodos de classes se lhe passares array('class', 'metodo'), e nesse caso o hash ia-te dar problemas (acho eu, mas já não mexo nisso há algum tempo).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, isto não está preparado para funções de classes, ainda bem que me lembras-te disso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se eu tiver 2 instancias da mesma classe, ele não vai fazer overwrite?

Btw, tens de passar a instancia por referência: &$objecto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se eu tiver 2 instancias da mesma classe, ele não vai fazer overwrite?

Btw, tens de passar a instancia por referência: &$objecto

Se a função e os argumentos forem iguais, sim, é esse o objectivo, logo o get_class().

E o objecto pode ser passado sem ser por referência, a não ser que queiras optimizar é isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, imagina que tens 2 instancias de uma class de ligação a uma BD, e cada instância vai buscar dados a um servidor diferente, e quero fazer cache dos dados dos 2 servidores. Ao passar por essa função, só vou guardar a primeira ou última instância que vou passar à função.

Esquece isso da referencia, tava a fazer confusão com outra coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, imagina que tens 2 instancias de uma class de ligação a uma BD, e cada instância vai buscar dados a um servidor diferente, e quero fazer cache dos dados dos 2 servidores. Ao passar por essa função, só vou guardar a primeira ou última instância que vou passar à função.

Mas tu não passarias a BD nos argumentos :D? Eu entendo, é uma questão de tirar o get_class a quem der mais jeito.

Ou então diz lá o que tinhas em mente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas tu não passarias a BD nos argumentos :D? Eu entendo, é uma questão de tirar o get_class a quem der mais jeito.

echo cache_function(array($dbs['principal'], 'displayTableContents'), 'userinfo');
echo cache_function(array($dbs['secundaria'], 'displayTableContents'), 'userinfo');

É um exemplo hipotético, mas prova que não é failproof :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora