batas memori php cli

35

Saya mendapatkan kesalahan memori dalam pekerjaan 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

Bagian crontab yang berlaku adalah:

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

Saya menjalankan Debian Squeeze, sepenuhnya diperbarui.

Solusi yang jelas adalah bahwa cli memiliki batas memori rendah (64MB). Namun, /etc/php5/cli/php.ini mengatakan ini tidak terbatas.

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

Saya membaca di suatu tempat bahwa itu bisa berbeda untuk pengguna yang berbeda, dan karena prosesnya berjalan sebagai www-data, saya berlari:

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

Bahkan apache / php.ini memiliki batas lebih tinggi dari yang diklaim oleh kesalahan:

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

Apa yang saya lewatkan? Di mana batas memori ini?

Ryan H
sumber

Jawaban:

61

IIRC, memory_limit yang tidak terbatas tidak didukung oleh CLI (saya akan mencoba mencari sumber untuk ini) tetapi untuk sekarang, coba kirimkan ke perintah:

php -d memory_limit=128M my_script.php

MEMPERBARUI

Rupanya saya bermimpi tentang memory_limit tidak terbatas tidak didukung untuk php cli. Apapun, sepertinya nilai dari ini diabaikan. Maka solusi paling sederhana adalah secara khusus mengaturnya dalam perintah php memanggil skrip.

UPDATE2

Untuk menjawab pertanyaan dari mana batas memori berasal, kemungkinan besar diatur dalam skrip itu sendiri menggunakan 'ini_set'.

DTest
sumber
Conf itu adalah konfigurasi default debian, tidak ada yang istimewa dari saya. Anehnya, komentar di atas mengatakan bahwa itu membuat batas memori 128 MB.
Ryan H
Hrm, pertanyaan dari mana nilai berasal (yang merupakan pertanyaan aktual ternyata / gagal membaca pemahaman) apakah Anda memiliki ini_set memory_limit dalam kode?
DTest
jalankan php --ini untuk mencetak daftar file konfigurasi yang dibacanya. Dalam konfigurasi FreeBSD ia akan mencari file di /usr/local/etc/php/*.ini setelah membaca main /usr/local/etc/php.ini
Allan Jude
tampaknya skrip mengatur memori secara internal ke nilai ini. Terima kasih telah membantu saya menyingkirkan hal-hal lain. Aku benar-benar tidak ingin seperti itu! Terima kasih atas tipnya.
Ryan H
1
Script menetapkan batas memorinya sendiri secara internal untuk aplikasi. Itu diatur ke 64 MB. Terima kasih telah membantu saya menemukannya.
Ryan H
0

Saat menguji versi php CLI 5.5.9, tampaknya di cli ia memiliki batas memori yang tidak ditentukan secara default, dan menetapkan php -d memory_limit=4G my_script.phpakan menetapkan batasan untuk itu.

adrianTNT
sumber
Itu tidak benar, CLI hanya akan mengikuti pengaturan memory_limit yang ditentukan dalam file php.ini
Tim
-3

Jika Anda menginstal PHP sebagai modul Apache (centang 'Server API' di phpinfo()), Anda harus memanggilnya melalui peramban web baris perintah (wget, curl, lynx, ...) dalam pekerjaan cron, sesuatu seperti ini:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1
kuanta
sumber
Itu hanya menghabiskan lebih banyak memori di Apache. Baik SAPI dan CLI diinstal, jadi yang terbaik adalah menggunakan CLI dalam kasus ini.
Allan Jude