обмеження пам'яті 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

Придатними частинами кронтабу є:

$ 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, повністю оновлений.

Очевидним рішенням було б те, що кліп має низький ліміт пам’яті (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, необмежений обмін пам’яті пам’яті не підтримується CLI (я спробую знайти джерело для цього), але наразі спробуйте передати його в команду:

php -d memory_limit=128M my_script.php

ОНОВЛЕННЯ

Мабуть, я мріяв про те, щоб необмежений обмін пам'яті не підтримувався для php cli. Незалежно від цього, схоже, що значення з ini ігнорується. Тоді найпростішим рішенням має бути спеціально встановити його в команді php, що викликає сценарій.

ОНОВЛЕННЯ2

Щоб відповісти на питання, звідки береться обмеження пам’яті, найімовірніше, він буде встановлений у самому сценарії за допомогою 'ini_set'.


Цей конф - конфігурація за замовчуванням debian, нічого особливого для мене. Як не дивно, коментар над ним говорить, що це обмежує обсяг пам'яті 128 Мб.
Ryan H

Хрм, питання, звідки походить значення (яке, власне, питання / не розуміння читання). Чи є у вас код-код ini_set memory_limit?
DTest

запустіть php --ini для друку списку файлів конфігурації, які він читає. У конфігурації FreeBSD він шукатиме файли в /usr/local/etc/php/*.ini після прочитання головного /usr/local/etc/php.ini
Аллан Джуд

видається, що сценарій всередині пам'яті встановлює це значення. Дякую, що допомогли мені виключити все інше. Я дуже не хотів, щоб це було так! Дякую за -d підказку.
Ryan H

1
Сценарій встановлює власний ліміт пам’яті всередині програми. Встановлено 64 Мб. Дякуємо, що допомогли мені знайти його.
Ryan H

0

Під час тестування CLI-версії CLI 5.5.9виявляється, що у cli він за замовчуванням має обмежений обсяг пам’яті, а вказуючи php -d memory_limit=4G my_script.phpвстановить обмеження на це.


Це невірно, CLI буде просто дотримуватися налаштування memory_limit, визначеного у файлі php.ini
Тім

-3

Якщо ви встановите PHP як модуль Apache (встановіть прапорець "Сервер API" phpinfo()), вам слід викликати його через веб-браузер командного рядка (wget, curl, lynx, ...) у роботі cron, приблизно так:

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

Це просто витрачає більше пам’яті на Apache. Встановлені і SAPI, і CLI, тому найкраще використовувати CLI в цьому випадку.
Аллан Джуд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.