предел памяти php cli

35

Я получаю ошибку памяти в задании 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

Применимые части crontab:

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

Я работаю на Debian Squeeze, полностью обновлен.

Очевидное решение состоит в том, что cli имеет низкий предел памяти (64 МБ). Тем не менее, /etc/php5/cli/php.ini говорит, что это неограниченно.

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

Я где-то читал, что это может отличаться для разных пользователей, и так как процесс выполняется как www-data, я запустил:

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

Даже apache / php.ini имеет более высокий предел, чем утверждает ошибка:

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

Чего мне не хватает? Где этот предел памяти?

Райан Х
источник

Ответы:

61

IIRC, неограниченный memory_limit не поддерживается CLI (я постараюсь найти источник для этого), но сейчас попробуйте передать его в команду:

php -d memory_limit=128M my_script.php

ОБНОВИТЬ

Очевидно, я мечтал о неограниченной памяти, не поддерживаемой php cli. В любом случае, похоже, что значение из ini игнорируется. Самое простое решение - это специально установить его в команде php, вызывающей скрипт.

UPDATE2

Чтобы ответить на вопрос, откуда берется ограничение памяти, скорее всего, оно устанавливается в самом скрипте с помощью «ini_set».

DTest
источник
Это conf - конфигурация Debian по умолчанию, ничего особенного от меня. Как ни странно, в приведенном выше комментарии сказано, что он ограничивает память 128 МБ.
Райан Х
Хм, вопрос о том, ГДЕ значение исходит (который, по-видимому, является реальным вопросом / нет понимания прочитанного), есть ли у вас ini_set memory_limit в коде?
DTest
запустите php --ini, чтобы напечатать список файлов конфигурации, которые он читает. В конфигурации FreeBSD он будет искать файлы в /usr/local/etc/php/*.ini после прочтения основного /usr/local/etc/php.ini
Аллан Джуд
кажется, что сценарий устанавливает внутреннюю память на это значение. Спасибо, что помогли мне исключить все остальное. Я действительно не хотел, чтобы это было так! Спасибо за подсказку -d.
Райан Х
1
Сценарий устанавливает собственный предел памяти внутри приложения. Было установлено 64 МБ. Спасибо за помощь в поиске.
Райан Х
0

При тестировании php-версии CLI 5.5.9выясняется, что в cli он по умолчанию имеет неограниченный лимит памяти, и при php -d memory_limit=4G my_script.phpего установке будет установлено ограничение.

adrianTNT
источник
Это не правильно, CLI будет просто следовать параметру memory_limit, указанному в файле php.ini
Тим
-3

Если вы устанавливаете PHP как модуль Apache (отметьте «Server API» phpinfo()), вы должны вызывать его через веб-браузер командной строки (wget, curl, lynx, ...) в задании cron, что-то вроде этого:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1
кванты
источник
Это просто тратит больше памяти на Apache. И SAPI, и CLI установлены, поэтому в этом случае лучше использовать CLI.
Аллан Джуд