php cli memory limit

35

Ich erhalte einen Speicherfehler in einem 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

Die anwendbaren Teile der Crontab sind:

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

Ich laufe auf Debian Squeeze, vollständig aktualisiert.

Die offensichtliche Lösung wäre, dass der CLI eine niedrige Speichergrenze (von 64 MB) hat. /Etc/php5/cli/php.ini sagt jedoch, dass es unbegrenzt ist.

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

Ich habe irgendwo gelesen, dass es für verschiedene Benutzer unterschiedlich sein kann, und da der Prozess als WWW-Daten ausgeführt wird, habe ich Folgendes ausgeführt:

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

Sogar die apache / php.ini hat ein höheres Limit als der Fehler behauptet:

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

Was vermisse ich? Wo ist diese Speichergrenze?

Ryan H
quelle

Antworten:

61

IIRC, ein unbegrenztes memory_limit, wird von der CLI nicht unterstützt (ich werde versuchen, eine Quelle dafür zu finden), aber versuchen Sie es vorerst an den Befehl weiterzuleiten:

php -d memory_limit=128M my_script.php

AKTUALISIEREN

Anscheinend habe ich davon geträumt, dass das unbegrenzte memory_limit für php cli nicht unterstützt wird. Unabhängig davon sieht es so aus, als würde der Wert von ini ignoriert. Die einfachste Lösung sollte dann darin bestehen, sie im PHP-Befehl, der das Skript aufruft, speziell festzulegen.

UPDATE2

Um die Frage zu beantworten, woher das Speicherlimit stammt, wird es höchstwahrscheinlich im Skript selbst mit 'ini_set' festgelegt.

DTest
quelle
Das conf ist die Debian-Standardkonfiguration, nichts besonderes von mir. Seltsamerweise besagt der Kommentar darüber, dass der Speicher auf 128 MB begrenzt ist.
Ryan H
Hrm, die Frage von WO der Wert herkommt (was ist die eigentliche Frage anscheinend / Leseverständnis nicht) hast du ein ini_set memory_limit im Code?
DTest
Führen Sie php --ini aus, um eine Liste der Konfigurationsdateien zu drucken, die gerade gelesen werden. In einer FreeBSD-Konfiguration wird nach Dateien in /usr/local/etc/php/*.ini gesucht, nachdem die Datei /usr/local/etc/php.ini
Allan Jude
Es scheint, dass das Skript den Speicher intern auf diesen Wert setzt. Vielen Dank, dass Sie mir geholfen haben, alles andere auszuschließen. Das wollte ich wirklich nicht! Danke für den -d Tipp.
Ryan H
1
Das Skript legt sein eigenes Speicherlimit für die Anwendung fest. Es wurde auf 64 MB festgelegt. Vielen Dank, dass Sie mir bei der Suche geholfen haben.
Ryan H
0

Beim Testen einer CLI-PHP-Version 5.5.9scheint es, dass in CLI standardmäßig eine unbegrenzte Speicherkapazität vorhanden ist. Wenn Sie diese angeben, php -d memory_limit=4G my_script.phpwird eine Einschränkung auf diese festgelegt.

adrianTNT
quelle
Das ist nicht richtig, CLI folgt einfach der Einstellung memory_limit, die in der Datei php.ini angegeben ist
Tim,
-3

Wenn Sie PHP als Apache-Modul installieren ("Server-API" aktivieren phpinfo()), sollten Sie es über einen Befehlszeilen-Webbrowser (wget, curl, lynx, ...) im Cron-Job wie folgt aufrufen:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1
Quanten
quelle
Das verschwendet nur mehr Speicher für Apache. Sowohl die SAPI als auch die CLI sind installiert. Verwenden Sie in diesem Fall am besten die CLI.
Allan Jude