Estou recebendo um erro de memória em um php cron job:
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 rodando no Debian Squeeze, totalmente atualizado.
A solução óbvia seria que o cli tenha um limite de memória baixo (de 64 MB). No entanto, /etc/php5/cli/php.ini diz que é ilimitado.
$ cat /etc/php5/cli/php.ini | grep memory_limit
memory_limit = -1
Li em algum lugar que poderia ser diferente para usuários diferentes 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
Mesmo 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?
IIRC, um memory_limit ilimitado não é suportado pela CLI (vou tentar encontrar uma fonte para isso), mas por enquanto, tente passá-lo para o comando:
ATUALIZAR
Aparentemente, eu estava sonhando com o memory_limit ilimitado não sendo suportado pelo php cli. Independentemente disso, parece que o valor do ini é ignorado. A solução mais simples deve ser defini-lo especificamente no comando php chamando o script.
ATUALIZAÇÃO2
Para responder à pergunta de onde vem o limite de memória, é mais provável que esteja sendo definido no próprio script usando 'ini_set'.
Ao testar uma versão do php do CLI
5.5.9
, parece que no cli ele tem um limite de memória ilimitado por padrão, e a especificaçãophp -d memory_limit=4G my_script.php
definirá uma limitação para isso.Se você instalar o PHP como um módulo Apache (marque 'Server API' em
phpinfo()
), você deve chamá-lo via navegador de linha de comando (wget, curl, lynx, ...) no cron job, algo assim: