Ölümcül hata: İzin bellek boyutu tükendi

6 Cevap php

HI, ben sadece şimdi çevrimiçi VPS sunucuya benim php test komut dosyası upload. Betik (4M, 7000Lines hakkında) bir büyük boy XML dosyasını ayrıştırmak için kullanılır. Ama IE Explorer aşağıdaki çevrimiçi hata mesajı gösterir.

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 77 bytes) in /var/www/test/result/index.php on line 26

Ben zaten başarıyla localhost php komut dosyası test eminim.

Herhangi bir yapılandırma benim VPS üzerinde değişiklik / etkinleştirilmelidir var gerek var mı? Php.ini veya apache sunucu için bazı ayar gibi? Ben sadece yaklaşık 200M bellek kullanımı benim VPS için DAİREMİZ vardır doğrulanmadı. Bunu nasıl düzeltebilirim?

......
function startElementHandler ($parser,$name,$attrib){
    global $usercount;
    global $userdata;
    global $state; // Line #26; 
    //Debug
    //print "name is: ".$name."\n";
    switch ($name) {
        case $name=="_ID" : {
        $userdata[$usercount]["first"] = $attrib["FIRST"];
        $userdata[$usercount]["last"] = $attrib["LAST"];
        $userdata[$usercount]["nick"] = $attrib["NICK"];
        $userdata[$usercount]["title"] = $attrib["TITLE"];
        break;
        }

        ......

        default : {$state=$name;break;}
    }
}

6 Cevap

PHP yapılandırma hafızasına sadece 16 megabayt PHP sınırlamaktadır. Bunu artırmak için php.ini içinde memory_limit yapılandırma yönergesini değiştirmek gerekir.

Bu gibi görünüyor php.ini içindeki satır arayın:

memory_limit = 16M

... Ve büyük bir değere değiştirmek (16M 16 megabayt =, sen ve saire, 64 megabayt için 64M gibi bir şey onu artırabilir). Bunun gibi bir satır bulamazsanız, bunu ekleyin.

Eğer sadece bir başına komut bazda artırmak için tercih ederseniz, ayrıca ini_set() sadece o komut için değerini değiştirmek için kullanabilirsiniz.

Ayrıca memory_get_peak_usage() programın parçası bellek yiyor hangi öğrenmek için kullanabilirsiniz.

SAX çözümleyici yerine bir DOM ayrıştırıcı kullanın ve bellek tükendi olmaz. SAX bağımsız doküman boyutu makul bir sabite sahiptir oysa DOM, gerçek belge akışı yapar 8-10 kat bellek kaplar.

ini_set("memory_limit","XXM");

bazı sunucular (VPS bu bir sorun olmamalı ama, çoğunlukla bir web hosting sorun) bu çalışmasını engeller olduğunu fark edebilirsiniz.

edit: yerine "XX" gibi, gerçek boyutunu yazmak 128M

Sizin için doğru kabul edilebilir ayarları seçtiğinizden emin olun:

  • file_uploads
  • upload_max_filesize
  • max_input_time
  • memory_limit
  • max_execution_time
  • post_max_size

Sen php.ini dosyasının yerini bulmak için phpinfo() işlevini çağırabilirsiniz, o da size değiştirmeniz gereken aşağıdaki ayarlar için geçerli değerlerini anlatacağım.

Siz de komut dosyası içinde bu değerlerin bazı ayarlamak için ini_set işlevini kullanabilirsiniz.

SEE:

Howto optimize your PHP installation to handle large file uploads.

Bu kirli ama büyük XML dosyaları ile bazı durumlarda bu düzenli ifadeler yoluyla değerlerini almak için daha hızlı! Bir iyi biçimlendirilmiş XML ise ve hiçbir sorun olmaması gerekir!

sahte kod:

preg_match('+<title>(.*)</title>+', $xml_content, $matches);
var_dump($matches);