límite de memoria php cli

35

Recibo un error de memoria en un trabajo cron de php:

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

Las partes aplicables del crontab son:

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

Estoy ejecutando Debian Squeeze, totalmente actualizado.

La solución obvia sería que el cli tiene un límite de memoria bajo (de 64 MB). Sin embargo, /etc/php5/cli/php.ini dice que es ilimitado.

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

Leí en alguna parte que podría ser diferente para diferentes usuarios, y dado que el proceso se ejecuta como www-data, ejecuté:

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

Incluso el apache / php.ini tiene un límite más alto que el que afirma el error:

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

¿Qué me estoy perdiendo? ¿Dónde está este límite de memoria?

Ryan H
fuente

Respuestas:

61

IIRC, un límite ilimitado de memoria no es compatible con la CLI (intentaré encontrar una fuente para esto) pero por ahora, intente pasarlo al comando:

php -d memory_limit=128M my_script.php

ACTUALIZAR

Aparentemente estaba soñando con el límite ilimitado de memoria no compatible con php cli. En cualquier caso, parece que se ignora el valor del ini. La solución más simple debería ser configurarlo específicamente en el comando php que llama al script.

ACTUALIZACIÓN2

Para responder a la pregunta de dónde proviene el límite de memoria, lo más probable es que se establezca en el script usando 'ini_set'.

DTest
fuente
Esa es la configuración predeterminada de Debian, nada especial para mí. Curiosamente, el comentario anterior dice que hace que el límite de memoria sea de 128 MB.
Ryan H
Hrm, la pregunta de DONDE viene el valor (que es la pregunta real aparentemente / falla en la comprensión de lectura) ¿tiene algún ini_set memory_limit en el código?
DTest
ejecute php --ini para imprimir una lista de los archivos de configuración que está leyendo. En una configuración de FreeBSD buscará archivos en /usr/local/etc/php/*.ini después de leer el /usr/local/etc/php.ini principal
Allan Jude
parece que el script está configurando la memoria internamente a este valor. Gracias por ayudarme a descartar todo lo demás. ¡Realmente no quería que fuera eso! Gracias por el consejo -d.
Ryan H
1
El script establece su propio límite de memoria internamente para la aplicación. Se estableció en 64 MB. Gracias por ayudarme a encontrarlo.
Ryan H
0

Al probar una versión CLI php 5.5.9, parece que en cli tiene un límite de memoria ilimitado por defecto, y la especificación php -d memory_limit=4G my_script.phpestablecerá una limitación a eso.

adrianTNT
fuente
Eso no es correcto, la CLI solo seguirá la configuración de memory_limit especificada en el archivo php.ini
Tim
-3

Si instala PHP como un módulo Apache (marque 'Servidor API' en phpinfo()), debe llamarlo a través del navegador web de línea de comandos (wget, curl, lynx, ...) en el trabajo cron, algo como esto:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1
quanta
fuente
Eso solo desperdicia más memoria en Apache. Tanto el SAPI como la CLI están instalados, por lo que es mejor usar la CLI en este caso.
Allan Jude