Php 33554432 bayt izin verilen bellek boyutu (43148176 bayt ayırmaya çalıştı) bitkin


279

Bu hata mesajı sunuluyor, herhangi bir öneriniz var mı?

Php 33554432 bayt izin verilen bellek boyutu (43148176 bayt ayırmaya çalıştı) bitkin


5
Php.ini dosyanızda maksimum bellek sınırınızı 64 MB'a yükseltin. Google'da arama Ama neden bu kadar bellek ayırmaya çalıştığınızı sorabilir miyim? Hangi kod satırında başarısız oluyor?

1
Komut dosyası başarısız olduğunda ne yapıyor? kodu gönderebilir misin
Neil Aitken

3
Çok büyük bir txt dosyası gibi görünüyor.
macbirdie

10
Geleneksel olarak, her seferinde bir satır potansiyel olarak büyük veya keyfi boyutta olan dosyaları okur, her satır okunduğunda önceki satır belleğinin üzerine yazarsınız. Ya da en son girişleri almak için dosyayı kuyruğa sokmak ya da yönlendirmek isteyebilirsiniz. Dosya büyüdükçe bellek ayırmayı kullanmak yanıt değildir.
ekerner

1
Olası Önemli Hata
kenorb

Yanıtlar:


319

Sonunda cevabı buldum:

Dosyanızda hata almadan önce bu satırı aşağıdaki satıra ekleyin

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

Sunucunun sınırsız bellek kullanımı alacak, iyi çalışıyor.

Öneri arkadaşlarına verdiğiniz için teşekkürler.


125
Yine de belleğin neden bittiğini kontrol etmelisiniz . Belki de tüm dosyayı okumak zorunda değilsiniz, belki de sırayla okumak zorundasınız.
macbirdie

8
- @panidarapu ve @Don Jones: Bellek miktarına ve bu komut dosyasının nasıl kullanıldığına bağlı olarak, bellek kullanımındaki değişikliğe bu şekilde izin vermek tehlikeli olabilir. Don, sizin durumunuzda, beslemeyi muhtemelen daha küçük parçalara ayırabilir ve ihtiyacınız olanı ayrıştırabilirsiniz. Çalışmasına sevindim, ama dikkatli ol.
anonim korkak

5
Bu öneri benim için çalıştı. Koddaki dinamik olarak artan bellek sınırı ini_set () fonksiyonu ile yapılır: ini_set ('memory_limit', '128M');
mente

37
Beyler, lütfen bu hızlı düzeltmeye gitmeyin. Uzun vadede size zarar verebilir. İyi bir programcı olarak, bu bellek tüketiminin arkasındaki nedeni bulmalı ve onu tutmak yerine gerektiği gibi artırmalısınız UNLIMITED.
Sumoanand

113
Vay, bu büyük ölçüde onaylanan cevap benim için gerçekten kötü bir uygulama gibi görünüyor. -1!
Ambidex

59

Paylaşılan barındırma sınırını artırmak için iki basit yöntem şunlardır:

  1. PHP.ini dosyanıza erişiminiz varsa, PHP.ini satırını değiştirin. Satırınız 32M gösteriyorsa 64M'yi deneyin: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. PHP.ini dosyasına erişiminiz yoksa, bunu bir .htaccess dosyasına eklemeyi deneyin: php_value memory_limit 64M


47

Betiğiniz çok fazla bellek kullanıyor. Bu, genellikle kontrolden çıkmış bir döngünüz varsa ve döngüyü her geçişinde nesne oluşturuyor veya dizilere ekliyorsanız PHP'de olabilir.

Sonsuz döngüler olup olmadığını kontrol edin.

Sorun bu değilse, bitmiş olduğunuz nesneleri null olarak ayarlayarak yok ederek PHP'ye yardım etmeyi deneyin. Örneğin.$OldVar = null;

Hatanın gerçekleştiği kodu da kontrol edin. Bu satırın büyük miktarda bellek ayırmasını bekler misiniz? Değilse, neyin yanlış gittiğini anlamaya çalışın ...


3
Ben tam olarak bu sorunu vardı - ben yanlışlıkla yinelemeli bir işlev oluşturmuştu - ve böylece kod yürütme sırasında herhangi bir rastgele zamanda bellek bitti. Bu benim için bir bellek sızıntısı avında yaratılan dünyanın en bellek etkin koduna sahip olmamı sağladı.
Kris Selbekk

1
Bir tavşanı bir delikten kovalayacak başkalarının uğruna. Symfony doktrin monolog ile ilgili bir sorun olduğunu düşünüyorum ve PDO istisna olduğunda, bu yüzden gerçek sorunu (benim durumumda bozuk bir db dosyası) gizleme istisna için bir istisna çalışacağız gibi istisnalar sonsuz bir döngü yaratacaktır.
Desislav Kamenov

39

Yapıyor:

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

asla iyi değildir. Çok büyük bir dosyayı okumak istiyorsanız, dosyayı yavaş yavaş kopyalamak en iyi uygulamadır. En iyi uygulama için aşağıdaki kodu deneyin.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;

6
Memory_limit'i -1 olarak ayarlamanızı tavsiye eden tüm bu insanlara inanamıyorum ... Bir üretim sunucusunda yapılacak çılgınca bir şey. Çok daha temiz bir çözüm için teşekkürler.
JohnWolf

2
"En iyi uygulama" iken, whiledöngüden sonra dosya işleyiciyi kapatmak iyidir :fclose($file)
kodeart

2
@assetCorp Dosyada örneğin 100MiB olması ve PHP bellek sınırının 32 MiB olarak ayarlanması koşuluyla bu nasıl yardımcı olur? Bunu 1MiB'lik güvenli parçalar ile okursunuz, ancak döngü 31'e ulaştığında kullanılabilir tüm belleği kullanacak bir değişkene eklersiniz. Yineleme. Nasıl daha iyi? Bunları sadece bir değişkente depolamayı gerektirmeyecek şekilde sadece çıktı almak sorunu çözmeye yardımcı olacaktır.
helvete

17

Ne yazık ki PHP'yi anladığınızdan daha hızlı bellek tüketen bir şekilde programlamak maalesef kolaydır. PHP 5'in PHP 4'ten daha otomatik olarak yapması gerekiyorsa da, referansları kullanmak yerine dizeleri, dizileri ve nesneleri kopyalamak bunu yapacaktır. Ancak, veri setinizle birkaç adımda tamamen ilgilenmek, en küçük mantıksal birimi işlemeye kıyasla israftır. zamanında. Klasik örnek, bir veritabanından büyük sonuç kümeleriyle çalışmaktır: çoğu programcı, tüm sonuç kümesini bir diziye getirir ve ardından bir veya daha fazla kez döngü yapar foreach(). Her while()seferinde bir satır almak ve işlemek için bir döngü kullanmak çok daha fazla bellek verimlidir . Aynı şey bir dosyayı işlemek için de geçerlidir.


Görünüşe göre bunu yapan da bu.
Kzqai

13

Büyük dosyaları okumak istiyorsanız, bunları bir kerede okumak yerine yavaş yavaş okumalısınız.
Basit matematik: Aynı anda 1 MB büyük bir dosya okursanız, verileri tutmak için aynı anda en az 1 MB bellek gerekir.

Bu yüzden fopen& kullanarak bunları yavaş yavaş okumalısınız fread.


1
Bunu kullanarak bunu $fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
çözdüm

12

Php7.2'de laravel 5.6 ile aynı problemle karşılaştım. Ben sadece memory_limit = 128Mbenim uygulamalar talep olarak php.ini değişken miktarını artırmak . 256M / 512M / 1048M olabilir .... Şimdi iyi çalışıyor.


6

Ben de aynı sorun yaşıyordu, boşuna phpinfo.ini, php.ini veya .htaccess dosyaları aradı. Sonunda bazı php dosyalarına baktım, onları açtım ve içindeki kodları bellek için kontrol ettim. Nihayet bu çözüm ortaya çıktığım şeydi ve benim için çalıştı. Wordpress kullanıyordum, bu yüzden bu çözüm sadece wordpress bellek boyutu sınırı problemi için işe yarayabilir. Benim çözümüm, default-constants.php dosyasını / public_html / wp-include klasöründe açın. Bu dosyayı kod düzenleyicisiyle açın ve wp_initial_constantskapsam altındaki bellek ayarlarını bulun veya "bellek" kelimesini bulmak için sadece Ctrl + F tuşlarına basın. Oraya geleceksin WP_MEMORY_LIMITve WP_MAX_MEMORY_LIMIT. Sadece artır, benim durumumda 64 MB, 128 MB'a ve sonra 200 MB'a çıkardım.

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Btw, lütfen aşağıdaki kodu yapmayın, çünkü bu kötü bir uygulamadır:

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

1
.Htaccess ve php.ini dosyalarına erişimin olmadığı wordpress web siteleri için çalışır. +1
Mustafa sabir

Bir 'çekirdek' WordPress dosyasında bu limitleri değiştirmenin gerçekten iyi bir fikir olmadığını söyleyebilirim; wp-config.phpbunun yerine, gelecekteki WordPress güncellemelerinin üzerine yazılmayacakları bu sınırları kolayca ekleyebilirsiniz . Ayrıca, birkaç temel eklenti (örneğin, WordFence gibi), 'çekirdek' WordPress dosyaları değiştirilirse şikayet edecektir ...
Gwyneth Llewelyn

1
@GwynethLlewelyn Bunu nasıl yapacağımı bilmiyorum, lütfen ayrıntılandırabilir misin?
garakchy

1
Ah ... sadece düzenleme wp-config.php. Ve (i .e iki satır var ekleyin define( 'WP_MEMORY_LIMIT', '200M' );ve define( 'WP_MAX_MEMORY_LIMIT', '256M' );. Dosyaların aksine altında yani, her şey 'çekirdek' WP (on wp-includesWP yükseltmeleri tarafından üzerine yazılır olacaktır), wp-config.phpolmaz - bu ötürü tam olarak orada WP sabitlerini geçersiz kılmanın tam amacı!
Gwyneth Llewelyn

1
"kötü uygulama" durumsaldır. -1kısa süreli işlemler için iyidir. Örneğin, birim testleri veya besteci yüklemeleri / vb. Çalıştırmak için kullanılan bir php oluşturucu kabı. Üretim sitenizi böyle ayarlanmış olarak çalıştırmayın.
Ocak'ta emmdee

5

Koddaki tüm kodların üstünde aşağıdaki satırı yürüterek php betiğine izin verilen belleği artırabilirsiniz:

ini_set('memory_limit','-1'); // enabled the full memory available.

Ayrıca koddaki istenmeyen değişkenleri de ayırın.

Bu php kütüphanesini kontrol edin: PHP ile bellek boşaltma



3

Birçok cevabın sadece bir betiğe yeri olan hafıza miktarını artırmaya çalıştığını fark ettim, ancak çoğu zaman beklenmedik miktarda veya boyuttan dolayı hafıza ile çok liberal olduğu anlamına gelmez. Açıkçası sizin değil bir senaryo yazarı sizin iddialı hissi sürece yazarın merhametinde :) PHP dokümanlar bile bellek sorunları " kötü yazılmış komut " nedeniyle olduğunu söylüyor

Belirtilmelidir ini_set('memory_limit', '-1');(sınır yok) olarak sunucu kararsızlığına neden olabilir 0 bytes free = bad things. Bunun yerine, komut dosyanızın ne yapmaya çalıştığına ve bir makinedeki kullanılabilir bellek miktarına göre makul bir denge bulun.

Daha iyi bir yaklaşım: Senaryonun yazarı (veya iddialı) iseniz, xdebug ile bu tür bellek sorunlarını ayıklayabilirsiniz . En son sürüm (2.6.0 - piyasaya sürülen 2018-01-29), hangi işlev çağrılarının büyük miktarda bellek harcadığını gösteren bellek profilini geri getirdi. Komut dosyasında bulunması zor olan sorunları ortaya çıkarır. Genellikle, verimsizlikler aldığı hacmi beklemeyen bir döngüdedir, ancak her vaka okuyucuya bir alıştırma olarak bırakılacaktır :)

Xdebug dokümantasyon yararlı, ancak 3 adımda aşağı kaynar:

  1. It yükleyin - Kullanılabilir through apt-getve yumvs
  2. Bunu yapılandır - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Profilleri QCacheGrind , KCacheGrind gibi bir araçta görüntüleme

2

Bir dosyayı okumaya çalışıyorsanız, bu PHP'de bellek alacaktır. Örneğin, bir MP3 dosyasını açmaya ve okumaya çalışıyorsanız (örneğin, $ data = dosya (" http://alanadim.com/yol/sample.mp3) ")) hepsini belleğe çekecektir .

Nelson'un önerdiği gibi, gerçekten bu kadar bellek kullanmanız gerekiyorsa, maksimum bellek sınırınızı artırmak için çalışabilirsiniz.


2

Benzer bir durum vardı ve cevapların en üstünde ini_set ('memory_limit', '-1') verildi; ve her şey 1 MB'tan KB'lere kadar iyi, sıkıştırılmış görüntü dosyaları çalıştı.


1

Yazmak

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

php etiketi açıldıktan sonra en üstteki index.php dosyasında


1

Wordpress'te yeni bir temaya geçtikten sonra aynı hata iletisini alıyordum. PHP sürüm 5.3 çalıştırıyordu, bu yüzden 7.2'ye geçtim. Bu sorunu düzeltti.


1

Paylaşılan bir barındırma kullanıyorsanız, php boyut sınırındaki artışı zorlayamazsınız.

Sadece cpanel gidin ve php sürümünüzü 7.1 ve üstüne yükseltin sonra gitmek için iyidir.


0

wordpress kullanıcıları satır ekle:

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

wordpress yüklü kök klasöründe bulabileceğiniz wp-settings.php dosyasında


0

Hostingimi yenilememiştim ve veritabanı salt okunurdu. Joomla'nın oturumu yazması gerekiyordu ve yapamadı.


0

Ben komut satırında çalışan php aynı sorunu vardı. Son zamanlarda, php.ini dosyasını değiştirdim ve php.ini değiştirilirken bir hata yaptım

Bu php7.0 içindir

hata yaptığım php.ini yolu: /etc/php/7.0/cli/php.ini

Ben batmıştı memory_limit = 256(ki aracı 256 bytes)
yerine memory_limit = 256M(ki aracı 256 Mega bytes).

; Bir komut dosyasının tüketebileceği maksimum bellek miktarı (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

Düzelttikten sonra, işlemim iyi çalışmaya başladı.



-1

laravel kullanıyorsanız bu yolları kullanın

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

onun yerine

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

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.