PHP memory_limit artırılması.

3 Cevap php

Şu anda üzerinde çalışıyorum bir sistemde, her neyse / toplayarak / sıralama için bir dizi içine büyük miktarda veri yükleyen bir süreç var. Ben bu işlem bellek kullanımı için optimize ihtiyacı olduğunu biliyorum, ama kısa vadede sadece çalışmak gerekiyor.

Diziye yüklenen veri miktarı göz önüne alındığında, biz bellek sınırına isabet tutmak. Bunu arttırılması genellikle kötü bir fikir haline bir nokta var o birkaç kez artmıştır, ve ben merak ediyorum? veya makinenin ne kadar RAM only bir konudur?

Makine RAM 2GB ve memory_limit şu 1.5GB ayarlanır. Biz kolayca makineye daha fazla RAM ekleyin (ve irade zaten) olabilir.

Diğerleri sorun bu tür karşılaştı mı? ve çözümler nelerdi?

3 Cevap

Sunucu web sayfalarına bir Apache modülü olarak çalışan PHP memory_limit için yapılandırma makinede aynı anda olabilir kaç Apache süreci dikkate almak zorunda - bakın {[(1)] Apache için} yapılandırma seçeneği.

MaxClients 100 ve 2000 MB RAM ya da varsa, çok hızlı bir hesaplama, (fazla 20 MB * kullanmak gerektiğini gösterecektir çünkü 20 MB * 100 istemcileri toplam ie = 2 GB RAM veya, sunucu olan bellek miktarı) * memory_limit değer.

Ve bu ... MySQL, sistemin kendisi gibi aynı sunucu üzerinde çalışan diğer şeyler, ki muhtemelen dikkate almadan Ve Apache zaten kendisi için bazı bellek kullanıyor olmasıdır.

Yoksa ki, bu da her bir PHP sayfası olabildiğince maksimum bellek miktarını kullanarak düşünen bir "en kötü durum senaryosu" olduğunu.


In your case, if you need such a big amount of memory for only one job, I would not increase the memory_limit for PḦP running as an Apache module.

Bunun yerine, komut satırından (or via a cron job) o işi başlatmak istiyorum, ve bu ilk ve tek durumda specificaly yüksek memory_limit belirtin.

Bu gibi php -d seçeneği ile yapılabilir:

$ php -d memory_limit=1GB temp.php
string(3) "1GB"

Bu durumda, göz önüne alındığında, bu temp.php sadece içerir:

var_dump(ini_get('memory_limit'));

Benim görüşüme göre, bu Apache için PHP modülü için memory_limit artan yol daha güvenli - ve ben büyük bir veri kümesi varsa ben genellikle ne, ya da gerçekten ağır şeyler ben optimize veya paginate olamaz.


If you need to define several values for the PHP CLI execution, you can also tell it to use another configuration file, instead of the default php.ini, with the -c option :

php -c /etc/phpcli.ini temp.php

Bu şekilde, var:

  • /etc/php.ini düşük memory_limit, düşük Apachenin için, max_execution_time, ...
  • ve /etc/phpcli.ini neredeyse sınırı yok ile komut satırından, çalıştırmak gruplar için

Bu toplu çalıştırmak mümkün olacak sağlar - ve hala (memory_limit ve max_execution_time güvenlik önlemleri olmak) web siteniz için güvenlik olacak


Still, if you have the time to optimize your script, you should ; for instance, in that kind of situation where you have to deal with lots of data, pagination is a must-have ;-)

Bellek sorunları tespit ihtiyacınız komut ile olduğunu biliyorum ve sadece kısa vadeli çözümler arıyoruz göz önüne alındığında, o zaman go about profiling ve hafıza sorunları çözme yollarını ele olmayacaktır. Bunu almak için gidiyoruz gibi geliyor.

Yani, aklınızda tutmak zorunda başlıca şeyler söyleyebilirim:

  • Sistemde toplam bellek yükü
  • OS yetenekleri

PHP sistemin sadece küçük bir bileşenidir. Eğer RAM geniş bir miktar yiyip izin verirseniz, daha sonra diğer işlemler sırayla komut kendisini etkileyebilecek, yaşayacaktır. Eğer bir veritabanı dışında bir çok veri çekerek olmadığını Özellikle, sonra DBMS sorguları için sonuç kümeleri oluşturmak için çok fazla bellek gerektirebilir olabilir. Hızlı bir düzeltme olarak, sizin çalıştırdığınız herhangi sorguları belirlemek ve kısa sürede kendinizi uzun vadede iş için daha fazla bellek vermek sonuçlarını ücretsiz isteyebilirsiniz.

OS yetenekleri açısından, büyük olasılıkla üzerinde çalışan 32-bit sistemler, sadece, özel işlem 4GB RAM kadar adres olduğunu akılda tutmak gerekir. Genellikle sınır nasıl kullanıldıklarını bağlı olarak daha az olabilir. Bazı Windows yonga setleri ve yapılandırmaları aslında hatta 4GB veya daha fazla fiziksel yüklü sistemi için kullanılabilir 3GB daha az olabilir. Eğer sistem ele ne kadar görmek için kontrol etmelisiniz.

Eğer hafıza limitini birkaç kez arttı ettik, çok açıktır ki bu iş kapsamı geniş ve daha büyük büyüyor söylüyorlar. Eğer 1.5Gb kadar iseniz, o zaman bile sadece kısa bir ferahlık olacak gibi daha fazla RAM geliyor 2Gb yükleme.

Have others encountered this kind of issue? and what were the solutions?

Ben muhtemelen zaten tek gerçek çözüm yıkmak ve yakında komut optimize etmek için zaman harcamak olduğunu biliyorum, ya da çalıştırmak için çok büyük olacak bir iş ile bitireceğiz.

Eğer seferde sadece bir kısım küçük parça ve süreç içine dataset bölme denediniz mi?

Eğer bir disk dosyasından veri almak varsa, veritabanı durumunda fread() function to load smaller chunks, or some sort of unbuffered db query kullanabilirsiniz.

Ben v3.something beri PHP kadar kontrol değil, ama aynı zamanda cloud computing bir formu kullanabilirsiniz. 1GB veri kümesi birden fazla makine üzerinde işlenecek kadar büyük gibi görünüyor.