Bellek PHP Out - Apache Çöküyor?

5 Cevap php

2.2.11: PHP sürümü 5.3.0 ve Apache çalıştırıyorum

(Sanırım) bellek tüketen bir PHP komut çalıştırmak - büyük döngüler vb My Apache web sunucusu, bir kaza raporları?!

[Sat Jan 02 00:51:30 2010] [notice] Parent: child process exited with status 255 -- Restarting.

Ben bir yerde belleği artırmak gerekir mi? Ben şu anda bellek için ayarladığınız

memory_limit = 512M 

PHP yüzden ben başka onun bir şey düşünüyorum, bu konuda şikayet değil mi?

Tüm teşekkürler

Update

Bu hata olay izleyiciye benim windows makine tarafından günlüğe edilmiştir:

Faulting application httpd.exe, version 2.2.11.0, time stamp 0x493f5d44, faulting module php5ts.dll, version 5.3.0.0, time stamp 0x4a4922e7, exception code 0xc0000005, fault offset 0x00083655, process id 0x1588, application start time 0x01ca8b46e4925f90.

Update 2

Söz Script. Ben URL kaldırdık.

<?php error_reporting(E_ALL);

set_time_limit(300000);

echo 'start<br>';

include_once('simple_html_dom.php');

$FileHandle = fopen('tech-statistics3.csv', 'a+') or die("can't open file");

for($i =1; $i < 101; $i ++){
 // Create DOM from URL
 $html = file_get_html("http://www.x.com/$i");

 foreach($html->find('div[class=excerpt]') as $article) {

  $item0 = $article->children(1)->children(1)->children[0]->plaintext;

  $item1 = $article->children(1)->children(1)->children[0]->plaintext;

  $item2 = $article->children(1)->children(0)->children(0)->children(0)->plaintext;

  //$item3 = $article->children(1)->children(0)->children(0)->children[1]->children(0)->next_sibling();

  $stringa = trim($item0).",".trim($item1).",".trim($item2)."\r\n";

  fwrite($FileHandle, $stringa);

  echo $stringa.'<br>';
  echo '------------>'.$i;
 }
}

fclose($FileHandle);

echo '<b>End<br>';

?>

Update 3

Ben PHP Basit HTML DOM Parser kullanıyorum ve ben sadece bu bulduk:

http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak

Ben aksi kilitlenmesine belleği temizledikten gerektiğini düşünüyorum. Şimdi test.

Update4

Evet, bu bir bellek sızıntısı oldu! :)

5 Cevap

Apache nedeniyle döngü için bir tekrar ve tekrar kullanılan bir kaynak kapanış yanı sıra, komut özyineleme yararlanarak değil neden bir bellek sızıntısı çökmesini edildi.

Tüm yardım için teşekkürler.

Windows üzerinde Apache, PHP ile bu gibi sorunların içine koşuyoruz. Aksine ekranında herhangi bir yararlı bilgi raporlamak yerine, süreç sadece ölür. Eğer mümkünse, Apache ve bir linux kutunun üzerinde kod çalıştıran öneririm PHP. Windows üzerinde, hiçbir şey hiç olur gibi görünüyor, oysa benim deneyim, bu arada genel bir bellek hatası olarak bu rapor verecek. Ben sadece bu arada özyineleme ile ne gördüm.

Bir döngü içinde HTML bir ton ayrıştırma zaman ben bugün bu koştu. Burada basit bir düzeltme:

$dom = file_get_html("http://www.x.com/$i");
... // parse your DOM
$dom->clear() // clear before next iteration

Ben her tekrarında yapıldığı zaman sadece benim için dom nesne üzerinde clear() yöntemini giderilebilir çağırıyor.

Basit HTML DOM kullanırken biraz geç partiye, ama ben bir Segmentasyon Fault'da aynı sorunu içine çalışan oldum. Ben $ html-> clear () kullanıyorum emin değilim; ve unset ($ html); Ben yükledim HTML aşağı temizlemek için, ama hala büyük bir veri kazıma sırasında Segmentasyon hatası hata alıyordum.

Ben simple_html_dom.php dosyasında bazı açık kod açıklama için gerekli bulundu. Simple_html_dom_node sınıf içinde () fonksiyonu açık aramak, ve içindeki her şeyi açıklama;

    function clear() {
            // These were causing a segmentation fault...
            // $this->dom = null;
            // $this->nodes = null;
            // $this->parent = null;
            // $this->children = null;
    }

Sen özyineleme kullanarak değiliz? Ben PHP hata gördüm ve sonsuz özyineleme oluşur herhangi bir yararlı günlük çıktısı olmadan Apache çocuğu öldürmek ettik.