web-dev-qa-db-ja.com

PHP CLIのメモリ制限

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のメモリ制限が低い(64MB)ことです。ただし、/ 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

何が欠けていますか?このメモリ制限はどこにありますか?

43
Ryan H

IIRC、無制限のmemory_limitはCLIでサポートされていません(これのソースを見つけようとします)が、今のところ、それをコマンドに渡してみてください:

php -d memory_limit=128M my_script.php

[〜#〜]更新[〜#〜]

どうやら無制限のmemory_limitがphp cliでサポートされていないことを夢見ていました。いずれにしても、iniの値は無視されているようです。最も簡単な解決策は、スクリプトを呼び出すphpコマンドで具体的に設定することです。

PDATE2

メモリ制限がどこから来ているかという質問に答えるために、おそらくそれは 'ini_set'を使用してスクリプト自体に設定されています。

76
DTest

CLI phpバージョンのテスト中5.5.9 cliではデフォルトでメモリ制限が許可されていないようです。php -d memory_limit=4G my_script.phpはそれに制限を設定します。

0
adrianTNT