Nasıl csv dosyası ithalat / ISBN Arama komut bellek sızıntısı önleyebilir

0 Cevap php

Benim web sitesi kullanıcıları kitapların listesini içeren bir csv dosya yüklemenize olanak sağlar. Komut daha sonra bu dosyayı okur ve PEAR Services_Amazon sınıfını kullanarak, Amazon karşı isbn numarasını kontrol eder, gelişmiş kitap veri döndürme. Ben kitap listesinde komut dosyasını çalıştırmak zaman ben ölümcül bir hata alıyorum kadar Ancak, tüketilen bellek miktarı giderek artar. 32 MB tahsis ile çöker önce anda, ben sadece CSV dosyasının 370 kayıtları okuyabilirsiniz.

Ben almak için bir kayıt dosyası 4500 ve 256 MB RAM ile bir sanal sunucu ile bir kullanıcı var, bu yüzden hafıza limitini artırmak bir çözüm değildir.

İşte CSV ithalat basitleştirilmiş bir versiyonu:

$handle = fopen($filename, "r");
 while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
 $isbn = $data[6];
 checkIsbn($isbn);
 }

Burada fonksiyon kesilmiş versiyonu:

function checkIsbn($isbn) {     
 $amazon = &new Services_Amazon(ACCESS_KEY_ID, SECRET_KEY, ASSOC_ID);
 // -- $options array filled with $isbn, other requested info --
 $products = $amazon->ItemSearch('Books', $options);        
 // -- Then I create an array from the first result --
  $product = $products['Item'][0];
  $title = $product['ItemAttributes']['Title']; 
  // -- etc... various attributes are pulled from the $product array --
 mysql_query($sql); // -- put attributes into our DB
  unset($product); 
  unset($products);
  usleep(1800000); // maximum of 2000 calls to Amazon per hour as per their API
return $book_id;    
 }

Ne denedim: dizilerini unsetting yanı sıra NULL'A ayarlayarak, işlevi ve CSV kod hem de. O bir sorun değil sağlamak için tüm zaman aşımı artmıştır. Ben XDebug yüklü ve bazı testler koştu, ama ben buldum tüm komut sadece (Ben hiçbir xdebug uzman değilim) bellekte Amazon sınıf erişilen her zaman artarak devam ettiği oldu. Ben belki Services_Amazon sınıfında değişkenler çalıştırmak oluyor her zaman temizlenmiş olmadığını düşünerek, ama nereye buradan gitmek için hiçbir fikrim yok ediyorum. Ben iki dizileri yapacağını unsetting umuyordu, ama hayır şans vermişti.

Düzenleme: Güncelleme: Ben bu PEAR sınıfta bir sorun olabilir ki karar verdik (ve PEAR ile ilgili burada bazı sorulara bakarak, bu mümkün görünüyor). Her neyse, benim cepten becerileri şu anda çok az, bu yüzden sayfayı birden çok kez yeniden bunu yapmak için bir yol bulundu - ayrıntılar için aşağıda benim cevaba bakınız.

0 Cevap