php cli hafıza sınırı


35

Bir php cron işinde bir bellek hatası alıyorum:

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'ın uygulanabilir kısımları:

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

Ben tam olarak güncellenen Debian Squeeze üzerinde çalışıyorum.

Açık bir çözüm, cli'nin düşük bir hafıza sınırına (64 MB) sahip olması olacaktı. Ancak /etc/php5/cli/php.ini bunun sınırsız olduğunu söylüyor.

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

Farklı kullanıcılar için farklı olabileceği bir yerde okudum ve işlem www-data olarak çalıştığından, şunu koştum:

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

Apache / php.ini bile hata iddiasında olduğundan daha yüksek bir sınıra sahiptir:

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

Neyi kaçırıyorum? Bu hafıza limiti nerede?

Yanıtlar:


60

IIRC, sınırsız bir memory_limit CLI tarafından desteklenmiyor (bunun için bir kaynak bulmaya çalışacağım) ama şimdilik, bunu komuta aktarmayı deneyin:

php -d memory_limit=128M my_script.php

GÜNCELLEME

Görünüşe göre php cli için desteklenmeyen sınırsız memory_limit hakkında rüya görüyordum. Ne olursa olsun, ini değeri göz ardı edilir gibi görünüyor. En basit çözüm, daha sonra özellikle betiği çağıran php komutunda ayarlanmalıdır.

Update2

Bellek sınırının nereden geldiği sorusuna cevap vermek için, muhtemelen 'ini_set' kullanılarak betiğin içinde ayarlanmış olabilir.


Bu conf debian varsayılan yapılandırma, benden özel bir şey değil. Garip bir şekilde, yukarıdaki yorum hafızayı 128 MB sınırına getirdiğini söylüyor.
Ryan H,

Hrm, değerin NEREYE geldiği sorusu (görünüşe göre asıl soru / okumayı anlama budur) kodda herhangi bir ini_set memory_limit var mı?
DTest

Okuduğu yapılandırma dosyalarının bir listesini yazdırmak için php --ini komutunu çalıştırın. Bir FreeBSD konfigürasyonunda /usr/local/etc/php/*.ini içindeki /usr/local/etc/php.ini dosyasını okuduktan sonra /usr/local/etc/php.ini içindeki dosyaları arayacaktır
Allan Jude

Komut dosyası, belleği dahili olarak bu değere ayarlıyor gibi görünüyor. Her şeyi ekarte etmeme yardım ettiğin için teşekkürler. Gerçekten böyle olmasını istemedim! -D ipucu için teşekkürler.
Ryan H

1
Betik, kendi bellek sınırını dahili olarak uygulamaya ayarlar. 64 MB olarak ayarlandı. Bulmama yardım ettiğin için teşekkürler.
Ryan H

0

Bir CLI php sürümünü test ederken 5.5.9, varsayılan olarak limitsiz sınırsız bellek limiti olduğu görülüyor ve bunun belirtilmesi php -d memory_limit=4G my_script.phpbunun için bir sınırlama getirecek.


Doğru değil, CLI sadece php.ini dosyasında belirtilen memory_limit ayarını takip edecek
Tim

-3

PHP'yi bir Apache modülü olarak yüklüyorsanız ('Sunucu API'sini kontrol edin' phpinfo()), cron job'da komut satırı web tarayıcısı (wget, curl, lynx, ...) aracılığıyla çağırmalısınız:

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

Bu sadece Apache'de daha fazla hafıza harcar. Hem SAPI hem de CLI yüklü olduğundan, bu durumda CLI'yi kullanmak en iyisidir.
Allan Jude
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.