limit pamięci php cli

35

Otrzymuję błąd pamięci w zadaniu 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

Odpowiednie części crontab to:

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

Korzystam z Debian Squeeze, w pełni zaktualizowany.

Oczywistym rozwiązaniem byłoby, że cli ma niski limit pamięci (64 MB). Jednak /etc/php5/cli/php.ini mówi, że jest nieograniczony.

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

Czytałem gdzieś, że może być różnie dla różnych użytkowników, a ponieważ proces działa jako dane www, uruchomiłem:

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

Nawet apache / php.ini ma wyższy limit niż twierdzi błąd:

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

czego mi brakuje? Gdzie jest ten limit pamięci?

Ryan H.
źródło

Odpowiedzi:

61

IIRC, nieograniczony limit_pamięci nie jest obsługiwany przez CLI (spróbuję znaleźć źródło tego), ale na razie spróbuj przekazać go do polecenia:

php -d memory_limit=128M my_script.php

AKTUALIZACJA

Najwyraźniej marzyłem o tym, żeby nieograniczona pamięć nie była obsługiwana przez php cli. Niezależnie od tego wygląda na to, że wartość z ini jest ignorowana. Najprostszym rozwiązaniem powinno być ustawienie go w poleceniu php wywołującym skrypt.

AKTUALIZACJA 2

Aby odpowiedzieć na pytanie, skąd pochodzi limit pamięci, najprawdopodobniej jest ustawiany w samym skrypcie za pomocą „ini_set”.

DTest
źródło
Ta konfiguracja jest domyślną konfiguracją Debiana, nic specjalnego ode mnie. Co dziwne, powyższy komentarz mówi, że powoduje ograniczenie pamięci do 128 MB.
Ryan H
Hrm, pytanie, skąd pochodzi ta wartość (które jest najwyraźniej pytaniem / zrozumieniem odczytu po przeczytaniu) czy masz w kodzie jakieś ini_set memory_limit?
DTest
uruchom php --ini, aby wydrukować listę plików konfiguracyjnych, które czyta. W konfiguracji FreeBSD będzie szukał plików w /usr/local/etc/php/*.ini po przeczytaniu głównego /usr/local/etc/php.ini
Allan Jude
wygląda na to, że skrypt wewnętrznie ustawia pamięć na tę wartość. Dzięki za pomoc w wykluczeniu wszystkiego innego. Naprawdę nie chciałem, żeby tak było! Dzięki za wskazówkę -d.
Ryan H
1
Skrypt wewnętrznie ustala własny limit pamięci dla aplikacji. Ustawiono na 64 MB. Dzięki za pomoc w znalezieniu go.
Ryan H
0

Podczas testowania wersji 5.5.9phi CLI wydaje się, że w cli ma domyślnie nielimitowany limit pamięci, a określenie go php -d memory_limit=4G my_script.phpspowoduje ograniczenie tego.

adrianTNT
źródło
To nie jest poprawne, CLI będzie po prostu przestrzegać ustawienia memory_limit określonego w pliku php.ini
Tim
-3

Jeśli zainstalujesz PHP jako moduł Apache (zaznacz „API Server” w phpinfo()), powinieneś wywołać go za pomocą przeglądarki internetowej wiersza poleceń (wget, curl, lynx, ...) w zadaniu cron, coś takiego:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1
kwanty
źródło
To tylko marnuje więcej pamięci na Apache. Zarówno SAPI, jak i CLI są zainstalowane, dlatego w takim przypadku najlepiej użyć interfejsu CLI.
Allan Jude