limite de memória php cli

35

Estou recebendo um erro de memória em um trabalho php cron:

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 71 bytes) in /opt/matrix/core/lib/DAL/DAL.inc on line 830

As partes aplicáveis ​​do crontab são:

$ sudo crontab -u www-data -l
MAILTO=root
# m h  dom mon dow   command
*/15 * * * * php /opt/matrix/core/cron/run.php /opt/matrix

Estou executando o Debian Squeeze, totalmente atualizado.

A solução óbvia seria que o cli tenha um limite baixo de memória (de 64 MB). No entanto, o /etc/php5/cli/php.ini diz que é ilimitado.

$ cat /etc/php5/cli/php.ini | grep memory_limit
memory_limit = -1

Eu li em algum lugar que poderia ser diferente para diferentes usuários e, como o processo está sendo executado como www-data, executei:

$ sudo -u www-data -s
$ php -i | grep memory_limit
memory_limit => -1 => -1
suhosin.memory_limit => 0 => 0

Até o apache / php.ini tem um limite maior do que o erro está reivindicando:

$ sudo cat /etc/php5/apache2/php.ini | grep memory_limit
memory_limit = 128M

o que estou perdendo? Onde está esse limite de memória?

Ryan H
fonte

Respostas:

61

IIRC, um memory_limit ilimitado não é suportado pela CLI (tentarei encontrar uma fonte para isso), mas por enquanto, tente passá-lo para o comando:

php -d memory_limit=128M my_script.php

ATUALIZAR

Aparentemente, eu estava sonhando com o ilimitado memory_limit não sendo suportado pelo php cli. Independentemente disso, parece que o valor do ini é ignorado. A solução mais simples deve ser configurá-lo especificamente no comando php que chama o script.

UPDATE2

Para responder à pergunta de onde o limite de memória vem, é mais provável que seja definido no próprio script usando 'ini_set'.

DTest
fonte
Essa conf é a configuração padrão do debian, nada de especial para mim. Estranhamente, o comentário acima diz que faz com que a memória limite 128 MB.
Ryan H
Hm, a pergunta de onde vem o valor (que é a pergunta real aparentemente / falha na compreensão de leitura) você tem algum ini_set memory_limit no código?
dtest
execute php --ini para imprimir uma lista dos arquivos de configuração que está lendo. Em uma configuração do FreeBSD, ele procurará por arquivos em /usr/local/etc/php/*.ini depois de ler o arquivo principal /usr/local/etc/php.ini
Allan Jude
parece que o script está configurando a memória internamente para esse valor. Obrigado por me ajudar a descartar todo o resto. Eu realmente não queria que fosse isso! Obrigado pela dica -d.
Ryan H
11
O script define seu próprio limite de memória internamente para o aplicativo. Foi definido como 64 MB. Obrigado por me ajudar a encontrá-lo.
Ryan H
0

Durante o teste de uma versão php da CLI 5.5.9, parece que no cli há limite de memória ilimitada por padrão, e a especificação php -d memory_limit=4G my_script.phpdefinirá uma limitação para isso.

adrianTNT
fonte
Isso não está correto, a CLI seguirá apenas a configuração memory_limit especificada no arquivo php.ini
Tim
-3

Se você instalar o PHP como um módulo Apache (verifique 'API do servidor' phpinfo()), deverá chamá-lo através do navegador da Web de linha de comando (wget, curl, lynx, ...) no trabalho cron, algo como isto:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1
quanta
fonte
Isso apenas desperdiça mais memória no Apache. O SAPI e a CLI estão instalados, portanto, é melhor usar a CLI nesse caso.
Allan Jude