limite di memoria php cli


35

Ricevo un errore di memoria in un lavoro cron 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

Le parti applicabili del crontab sono:

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

Sto correndo su Debian Squeeze, completamente aggiornato.

La soluzione ovvia sarebbe che il cli ha un limite di memoria basso (di 64 MB). Tuttavia, /etc/php5/cli/php.ini dice che è illimitato.

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

Ho letto da qualche parte che potrebbe essere diverso per diversi utenti e poiché il processo è in esecuzione come www-data, ho eseguito:

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

Anche l'apache / php.ini ha un limite superiore a quello che l'errore sostiene:

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

Cosa mi sto perdendo? Dov'è questo limite di memoria?

Risposte:


61

IIRC, un memory_limit illimitato non è supportato dalla CLI (cercherò di trovare un sorgente per questo) ma per ora, prova a passarlo nel comando:

php -d memory_limit=128M my_script.php

AGGIORNARE

Apparentemente stavo sognando che il memory_limit illimitato non era supportato per php cli. Indipendentemente da ciò, sembra che il valore di ini sia ignorato. La soluzione più semplice dovrebbe quindi essere quella di impostarlo specificamente nel comando php che chiama lo script.

UPDATE2

Per rispondere alla domanda da dove provenga il limite di memoria, molto probabilmente viene impostato nello script stesso usando 'ini_set'.


Quella conf è la configurazione predefinita di Debian, niente di speciale da parte mia. Stranamente, il commento sopra dice che rende il limite di memoria di 128 MB.
Ryan H,

Hrm, la domanda di DOVE viene il valore (che è la domanda effettiva apparentemente / non riesce a leggere la comprensione) hai qualche ini_set memory_limit nel codice?
DTest,

eseguire php --ini per stampare un elenco dei file di configurazione che sta leggendo. In una configurazione di FreeBSD cercherà i file in /usr/local/etc/php/*.ini dopo aver letto il principale /usr/local/etc/php.ini
Allan Jude,

sembra che lo script stia impostando la memoria internamente su questo valore. Grazie per avermi aiutato a escludere tutto il resto. Non volevo davvero che fosse quello! Grazie per il suggerimento -d.
Ryan H,

1
Lo script imposta il proprio limite di memoria internamente all'applicazione. Era impostato su 64 MB. Grazie per avermi aiutato a trovarlo.
Ryan H,

0

Durante il test di una versione php della CLI 5.5.9sembra che in cli abbia un limite di memoria illimitato per impostazione predefinita, e specificando php -d memory_limit=4G my_script.phpsi imporrà una limitazione.


Non è corretto, la CLI seguirà semplicemente l'impostazione memory_limit specificata nel file php.ini
Tim

-3

Se installi PHP come modulo Apache (controlla 'Server API' in phpinfo()), dovresti chiamarlo tramite browser web della riga di comando (wget, curl, lynx, ...) in cron job, qualcosa del genere:

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

Questo spreca solo più memoria su Apache. Sia SAPI che CLI sono installati, quindi in questo caso è meglio usare l'interfaccia della riga di comando.
Allan Jude,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.