2012-01-31 19 views
5

Belirli PHP betikleri için izin verilen belleği artırmaya çalışıyorum. Hayır yaparsam yapayım, örneğin bunun için:PHP 300MB RAM kullanamaz

ini_set('memory_limit', '512M'); 

... senaryo hep 300MB civarında bellek biterse:

Birkaç tarafından doğrulandıktan
Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255 

memory_limit aslında değişmiş demektir . Sorun, PHP'nin toplam olarak 300   MB bellek (25165824   bayt + 343810589   bytes = 352   MB) fiziksel olarak ayrıştırılamaması gibi görünüyor.

denedim hem şu görüşler ile PHP/5.3.0 ve iki farklı Windows tabanlı bilgisayarlar PHP/5.3.9:

Windows XP/Windows Server 2003
  • (iki bilgisayarın 32- vardır 1GB veya RAM) ile biraz kutuları
  • Resmi PHP 32 bit VC9 ikili
  • anlıyorum Apache 2.2 modülü (üçüncü parti 32 bit VC9 ikili)

olarak Running fiziksel RAM kullanarak yarım swa zorlayacak ping ve yavaş şeyler cehennem gibi ama ben sadece betiğin gerçekte çalıştığından emin olmalıyım böylece canlı sunucuya dağıtılabilir. Ayrıca daha büyük değerler (aynı hatayı sağlayan) ve daha küçük değerler denedim (ya da komutumun limiti vurmasıyla veya Apache çökmesini yaptı).

Bu açıkça kodlanmış bellek sınırının kaynağı ne olabilir?

Güncelleştirme # 1: Windows Server 2003 kutusuyla (aslında bir VMWare sanal makinesi olan) daha fazla test yaptım. "Fiziksel" RAM'i 2   GB'ye yükselttim ve disk belleği dosyasının 1152   MB'ye kadar büyümesine izin verildiğini doğruladım. Görev yöneticisi, geçerli işlem yükünün 886   MB olduğunu ve 1,5   GB boş fiziksel belleğin olduğunu gösterir. Ancak, aynı hatayı tam olarak aynı rakamları ile alıyorum.

Güncelleme # 2: Dediğim gibi, memory_limit yönergesi gayet iyi. Hem ini_get() hem de phpinfo()'da görünür. Aldığınız hata mesajı benimkinden biraz farklı; benim bir numaralı kazayı gösteriyor. Karşılaştırma:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) 
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes) 

Sorunu yeniden oluşturmak ve raporlamak için bir komut dosyası oluşturmaya çalışacağım.

+0

PHP bir seferde o kadar çok belleği yakalamaya çalışıyorsa, bir dosya yüklemeye çalıştığınızı varsayalım .... dosyayı bir seferde değil, parça halinde yüklemeyi deneyin. –

+0

«Eğer optimize edemiyorsanız , daha fazla RAM al ... »Eh, bir süre yanlış ...; Tüm bu belleğe ihtiyacınız olduğuna emin misin? 300MB çok büyük bir miktardır. Belki senaryonuzu biraz daha iyi hale getirebilirsin ... – Macmade

+2

İşletim sisteminin, ayırmak için 300MB'den fazla boş belleğe sahip olduğundan% 100 emin misiniz? – DaveRandom

cevap

4

Bir OOM istisnası bellek sınırı uyarılarına göre farklıdır.

Bu, PHP'nin belleği tahsis edemeyeceği anlamına gelir, çünkü işletim sisteminizde yetersiz kaynak bulunur. Sistemin, bunu desteklemek için yeterli bellek/disk belleği olup olmadığını kontrol etmeniz gerekmektedir.

+0

Soruyu güncelledim. Sunucu, görünüşe göre, yeterli belleğe sahip. –

0

PHP aslında max_input_time demektirmemory_limit diyor bazen zaman, max_input_time ile deneyin (-1 Bunun için sonsuzdur).

+0

İyi nokta. Ama değer zaten 20 dakikaya ayarlanmış ve kaza daha erken gerçekleşiyor. Bunu yaptığımdan beri üzerinde çalışmıyorum ama er ya da geç kodun düzeltilmesi gerektiğini biliyorum, böylece ilk etapta çok fazla belleğe ihtiyaç duymaz. –

+0

Uhmm o zaman artık üzgünüm! – R01010010

İlgili konular