69 votes

Limite de mémoire du php cli

J'obtiens une erreur de mémoire dans une tâche 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

Les parties applicables de la crontab sont :

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

Je fonctionne sous Debian Squeeze, entièrement mis à jour.

La solution évidente serait que le client ait une faible limite de mémoire (64 Mo). Cependant, le fichier /etc/php5/cli/php.ini indique qu'elle est illimitée.

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

J'ai lu quelque part que cela pouvait être différent pour différents utilisateurs, et puisque le processus est exécuté en tant que www-data, je l'ai exécuté :

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

Même le fichier apache/php.ini a une limite plus élevée que celle réclamée par l'erreur :

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

Qu'est-ce que je rate ? Où se trouve cette limite de mémoire ?

156voto

Derek Downey Points 3565

IIRC, un memory_limit illimité n'est pas supporté par le CLI (je vais essayer de trouver une source pour cela) mais pour l'instant, essayez de le passer dans la commande :

php -d memory_limit=128M my_script.php

UPDATE

Apparemment, je rêvais que la limite de mémoire illimitée n'était pas supportée par le php cli. Quoi qu'il en soit, il semble que la valeur de l'ini soit ignorée. La solution la plus simple devrait alors être de la définir spécifiquement dans la commande php appelant le script.

UPDATE2

Pour répondre à la question de savoir d'où vient la limite de mémoire, elle est très probablement définie dans le script lui-même en utilisant 'ini_set'.

2voto

Scott Kirkwood Points 967

En testant une version CLI de php 5.5.9 il semble que dans cli, il y a une limite de mémoire illimitée par défaut, et en spécifiant php -d memory_limit=4G my_script.php fixera une limite à cela.

-4voto

quanta Points 49664

Si vous installez PHP en tant que module Apache (vérifiez l'option "Server API" dans la section phpinfo() ), vous devriez l'appeler via un navigateur web en ligne de commande (wget, curl, lynx, ...) dans une tâche cron, quelque chose comme ceci :

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X