Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia pessoal.
Serei direto.
Preciso saber como economizar a memória de nosso servidor em passagens de parâmetro em funções, pois todos sabemos que o PHP gera uma cópia das variáveis quando passadas por parâmetro. Tentei fazer isso passando os parâmetros por referência, mas pelo que pesquisei, isso não vai resultar em economia de memória.
A questão é a seguinte, tenho uma função, onde passo uma carroçada de dados como parâmetro, mas essa função analisa algumas informações e direciona esses mesmo dados a outra função, aí fica duas vezes esses dados na memória entende, tem como evitar isso? O código é como esse aqui:
//olha aqui passo os dados que serao usados
//mas tem q analizar qual eh o sistema de emissao de notas do cliente para
//tratar diferente cada um deles, por isso chamamos analizaSistemaEmitente()
$this->analizaSistemaEmitente($param);
//e aqui a gnt analiza e direciona para a funcao certa.
private function analizaSistemaEmitente($param){
if($sistema=1){
$this->sendSistema1($param);
}elseif($sistema=2){
$this->sendSistema2($param);
}
}
Perceberam, o PHP tem de fazer a cópia do parametro, em cada funcao que passa, sendo que os dados ficam inalterados até chegar na função final. mas como disse anteriormente, passagem por referência não economiza memória, se alguém conseguir me dar uma dica de como fazer isso agradeço.
Obrigado.
Referências servem para que os parâmetros passados possam ser manipulados por uma função. A referência é automática para objetos (a não ser que use o operador clone), mas para os primitivos não. E isso não vai otimizar memória.
--
Me desculpe, mas eu vou ser sincero: para que você quer fazer isso? está sofrendo problemas de memória no servidor? verifique se está com algum código fazendo uma operação pesada que possa ser otimizada ou então, mude para um servidor superior.
No método analizaSistemaEmitente, de onde vem a variável $sistema? E como está usando OOP, poderia implementar um strategy ao invés desse bando de ifs.
--
Explique um pouco melhor o problema e o que você está tentando fazer, ficou confuso.
mangakah, o que o Luiz disse faz sentido. O PHP somente faz uso de mais memória se o valor das variáveis for diferente.
Referências:
http://www.research.ibm.com/trl/people/mich/pub/200901_popl2009phpsem.pdf (Científico)
http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html (Explicação)
E aqui a comprovação:
<?php
$string = 'lorem ipsum dolor sit amet braga ihaus';
for($i = 0; $i < 200000; $i++)
${"a$i"} = $string;
echo memory_get_usage(true);
echo '<br />';
for($i = 0; $i < 200000; $i++)
${"a$i"} =& $string;
echo memory_get_usage(true);
Retorno:
2228224022282240
Mas concordo com o Enrico: a princípio não faz muito sentido toda essa busca por otimização.
[]'s
mangakah, o que o Luiz disse faz sentido. O PHP somente faz uso de mais memória se o valor das variáveis for diferente.
Não entendi... pra mim eu é quem disse que o PHP não usará mais memória para um mesmo valor e o Luiz disse que o PHP "gera uma cópia". Esses links que você passou confirma o que eu disse e contradizem o que o Luiz disse, não o contrário. Ou então eu não sei mais como interpretar textos.
Esses links que você passou confirma o que eu disse e contradizem o que o Luiz disse, não o contrário.
Opa, desculpe amigo. Estava com pressa e acabei mal-interpretando suas palavras.
No problem. :thumbsup:
Perfeito, obrigado galera, realmente estava equivocado.
Onde você viu isso? Me passa o link.
Pelo que sei, PHP armazena o valor e o tipo da variável em um container (chamado zval) e as referências para esse valor em outro container (zref). No container zval, além do valor e do tipo da variável, há mais duas informações: is_ref (que define se a variável foi passada por referência) e refcount que define quantas referências para aquele valor existem.
Leia mais sobre isso em Reference Counting.
Eu testei aqui passando um parametro para a função e a única coisa que alterou foi o número de referências, ou seja, as duas referências ('a' e 'b') aponta para o mesmo zval:
Obs. que a função xdebug_debug_zval só está disponível se xdebug estiver instalado.