limite de mémoire php cli

35

Je reçois une erreur de mémoire dans un travail 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 cours sur Debian Squeeze, entièrement à jour.

La solution évidente serait que la cli ait une limite de mémoire basse (64 Mo). Cependant, /etc/php5/cli/php.ini dit que c'est illimité.

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

J'ai lu quelque part que cela pourrait être différent pour différents utilisateurs, et puisque le processus s'exécute en tant que www-data, j'ai lancé:

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

Même apache / php.ini a une limite plus élevée que l'erreur ne prétend:

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

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

Ryan H
la source

Réponses:

61

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

php -d memory_limit=128M my_script.php

MISE À JOUR

Apparemment, je rêvais que le memory_limit illimité ne soit pas supporté par 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 le 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, il est fort probable que le script lui-même le définisse à l'aide de 'ini_set'.

DTest
la source
Cette conf est la configuration par défaut de Debian, rien de spécial de ma part. Étrangement, le commentaire ci-dessus indique que la mémoire est limitée à 128 Mo.
Ryan H
Hrm, la question de l’origine de la valeur (quelle est la vraie question apparemment / l’échec de la compréhension en lecture) avez-vous un ini_set memory_limit dans le code?
DTest le
lancez php --ini pour imprimer une liste des fichiers de configuration lus. Dans une configuration FreeBSD, il recherchera les fichiers dans /usr/local/etc/php/*.ini après avoir lu le répertoire principal /usr/local/etc/php.ini
Allan Jude le
il semble que le script mette la mémoire en interne à cette valeur. Merci de m'aider à écarter tout le reste. Je ne voulais vraiment pas que ce soit ça! Merci pour le conseil -d.
Ryan H
1
Le script définit sa propre limite de mémoire en interne pour l'application. Il était réglé sur 64 Mo. Merci de m'aider à le trouver.
Ryan H
0

Lors du test d'une version php de l'interface de ligne de commande, 5.5.9il apparaît que, dans cli, la limite de mémoire non autorisée est définie par défaut php -d memory_limit=4G my_script.php. Cette spécification définira une limitation à cette limite.

adrianTNT
la source
Ce n'est pas correct, la CLI suivra simplement le paramètre memory_limit spécifié dans le fichier php.ini
Tim
-3

Si vous installez PHP en tant que module Apache (cochez la case "API du serveur" phpinfo()), vous devez l'appeler via un navigateur Web en ligne de commande (wget, curl, lynx, ...) dans le travail cron, à peu près comme ceci:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1
quanta
la source
Cela ne fait que gaspiller plus de mémoire sur Apache. La SAPI et la CLI sont toutes deux installées. Il est donc préférable d'utiliser la CLI dans ce cas.
Allan Jude