PHP: Ölümcül Hata: Bitkin 134217728 byte İzin Hafıza Boyutu (CodeIgniter + XML-RPC)

9 Cevap php

Ben düzenli olarak rapor nesil için büyük bir veritabanına veri depolayan merkezi bir veritabanına, yeni satış verileri göndermek satış (POS) sistemleri istemci noktasında bir grup var.

İstemci POS PHPPOS dayanmaktadır, ve ben servise satış verilerini göndermek için standart XML-RPC kitaplığı kullanan bir modülü hayata geçirdik. Sunucu sistemi CodeIgniter üzerine inşa edilmiş, ve webservice bileşeni için XML-RPC ve XML-RPCS kütüphaneleri kullanır. Ben (satış içindeki her öğeye ait sales_items 50 satış tablosundan satır ve tek tek satırlara kadar küçük) satış verilerinin bir sürü göndermek zaman ben aşağıdaki hatayı alıyorum:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M php.ini varsayılan değerdir, ama bu kırmak için büyük bir sayı olduğunu varsayalım. Aslında, ben bile 1024M için bu değeri ayarı denedim, ve öyle tüm dışarı hata daha uzun bir zaman alabilir olduğunu.

Ben aldım adımlar gelince, sunucu tarafındaki tüm işlem devre dışı denedim, ve ne olursa olsun giriş konserve yanıt dönmek için hileli var. Ancak, sorun veri gönderilmesini gerçek yatıyor inanıyoruz. Hatta PHP için maksimum betik çalıştırma zamanı devre dışı bırakma denedim, ve hala hatalar dışarı. Yardımlarınız için çok teşekkür ederim!

9 Cevap

ini_set('memory_limit', '-1'); varsayılanı geçersiz kılar PHP memory limit.

İnsanlar tarafından memory_limit değişiyor

ini_set('memory_limit', '-1');

hiç bir çözüm değildir. Bunu etmeyiniz. Açıkçası php yerde bir bellek sızıntısı var ve sadece istediği tüm bellek kullanmak için sunucuyu anlatıyorsun. Sorun tüm sabit olmamıştır. Eğer sunucu monitör varsa, şimdi muhtemelen RAM en kadar kullanarak ve hatta diske takas olduğunu göreceksiniz.

Muhtemelen kodunuzu tam hata izini ve bunu düzeltmek için çalışmalısınız.

Eğer böyle bir ORM olarak soyutlama, kullanmak, özellikle eğer - bir PHP komut dosyası bellek sızıntılarını almak çok kolay. Lütfen komut profil ve tüm bu bellek nereye gittiğini bulmaya Xdebug kullanmayı deneyin.

Drupal kullanıcıları için, bu Chris Lane'nın cevap:

ini_set('memory_limit', '-1');

çalışır ama biz sadece açılmasından sonra koymak gerekir

<?php

sitenizin kök dizininde index.php dosyasında etiketlemek.

The correct way is to edit your php.ini file. Edit memory_limit to your desire value.

Senin soru olarak, 128M (varsayılan sınırı olan) aşıldığı, bu yüzden o kadar almamalıdır gibi kod ile ciddi bir terslik var.

O kadar sürer neden biliyor ve bunu memory_limit = 512M veya daha yüksek ayarlamak izin vermek istiyorsanız ve iyi olmalıdır.

Drupal 7, sizin sites / default klasöründe bulunan settings.php dosyasında bellek limitini değiştirebilirsiniz. 260 hattı etrafında, bunu göreceksiniz:

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

Php.ini ayarları yeterince yüksek olsa bile, bu Drupal settings.php dosyasında ayarlı değilse 128MB daha fazla tüketmek mümkün olmayacaktır.

After enable these two lines.
It's started working

; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; http://php.net/realpath-cache-size
realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://php.net/realpath-cache-ttl
realpath_cache_ttl = 120


Detailed Answer:


Varsayılan php tarafından 128MB bellek kullanmanıza izin verir. Iki çözüm vardır.

1. Permanent in your hosting or WAMP/XAMP etc software

php.ini dosyasında değişiklik varsayılan php bellek ayarları. Düzenlemek memory_limit sizin arzu değer. varsayılan bellek 128M olmalıdır. Eğer istersen onu değiştirebilirsiniz.

2. Temprary in your .php file

<?php ini_set('memory_limit', '512M'); ?>, sınırsız bellek <?php ini_set('memory_limit', '-1'); ?> izin vermek istiyorsanız ya da bu kodu kullanarak hafızayı belirtebilirsiniz eğer şu kodu kullanabilirsiniz

CodeIgniter kullanıcıları için, bu Chris Lane'nın cevap:

ini_set('memory_limit', '-1');

çalışır ama biz sadece başlangıcını it koymak gerekir

<?php

sitenizin kök dizininde index.php dosyasında etiketlemek.