php / timeout / server reset bağlantısı?

6 Cevap php

Ben uzunca bir süre çalıştırmak için gereken bir php komut dosyası var.

Ne komut dosyası yapar:

  • mysql bağlanır
  • 100 100,000 cURL istekleri yerden başlatır
  • Her cURL isteği 1-2000 emlak listeleri kompakt çözümlenmiş veri döndürür - i tüm verileri almak için gebelik maç tümünü kullanabilir ve liste başına bir mysql ekleme yapmak. Her sorgu veri fazla 1MB aşıyor asla.

Yani devam döngüler, mysql ekler ve kıvırmak istekleri bir yeri vardır. php güvenli mod kapalı ve başarıyla benim script tüm yol boyunca çalışmasına izin vermek için saçma bir şey için max-yürütme-zamanı ini_set mümkün duyuyorum.

Eh, benim sorunum komut dosyası veya apache falan yazısının ortasında bir felç geçiriyor ve ekran ekran "reset edilmiş bir sunucuya bağlanmak" için gider.

Herhangi bir fikir?

6 Cevap

Peki, 100.000 cURL istekleri çalışırken kesinlikle deli olduğu gerçeğini göz ardı ederek, muhtemelen hafıza limitini vuruyorlar.

Daha makul bir şey bellek sınırı ayarlamayı deneyin:

ini_set('memory_limit', '256M');

Ve bir yan ipucu olarak, gülünç bir şey için yürütme zamanı ayarlamak yok, şansını sonunda bu gibi bir komut ile bu vurmak için bir yol bulacaksınız vardır. ;]

Bunun yerine, sadece onu set 0, bu yürütme sınırını tamamen kapatarak işlevsel eşdeğeri:

ini_set('max_execution_time', 0);

Fikirler Lots:

1) bir HTTP isteği içine yapmayın. Sürmek için bir komut satırı php komut dosyası yazın. Gerekirse, onu tekmelemek için bir web-bağlı komut dosyasını kullanabilirsiniz.

2) sıfıra max_execution_time ayarlayın (ya da (0 set_time_limit çağrı)) Bir zaman limiti aşan kapatmaya alamadım sağlamak gerekir

Eğer gerçekten daha aklı başında bir şey içine bu refactor istediğiniz gibi 3) ​​geliyor. Küçük bir iş kuyruk sistemi kurma ve birkaç çocuk tüm çalışma sayesinde çiğnemek çatallar bir php komut dosyası sahip düşünün.

Josh dediği gibi, sizin error_log bakmak ve hemen kapatıldı konum neden bakın. Eğer kullandığınız ne kadar bellek anlamaya çalışın - bu bir sorun olabilir. Sıfıra max_execution_time ayarlamayı deneyin. Hızlı bir şekilde olması gereken yere Belki de alırsınız.

Bir http isteği içinde yapmak için çok fazla iş var gibi ama uzun vadede, bu sesler. Http dışına almak ve bölmek ve fethetmek!

Php.ini değiştirme ve komut dosyası yürütme değişkenini ayarlayarak indefinate olarak zaman aşımını ayarlayabilirsiniz.

Ama aynı zamanda hafif bir mimari değişiklik düşünebilirsiniz. İlk 100.000 kıvırmak isteklerini elde bir "başlatın ve unut" yaklaşımını düşünün. İkincisi, yerine düzelene "wget" kullanmayı düşünün.

Sen sorunu basit bir "wget URL -o UniqueFileName &," Bu, bir web sayfası almak olacak o arka planda bir "benzersiz" dosya ve tüm kaydedin.

Sonra (preg_matching) verileri greping, ve DB arama yapmak, dosyaların bir dizin üzerinde yineleme yapabilirsiniz. Eğer bir arşive bunları işlemek gibi dosyaları taşımak ve daha fazla dosya vardır kadar yineleme devam ediyor.

Bir "kuyrukta" olarak dizinin düşünün ve bir süreç sadece dosyaları işlemek var. İkinci süreç sadece dışarı çıkmak ve kapmak web sayfası veri var. Sen enstantane istatistik raporlarını, bağımsız ve sadece çalışır "monitör" Eğer olabilen bir üçüncü süreci ekleyebilirsiniz. Diğer iki sadece hayır arayüzü ile "web servisleri" olabilir.

Çoklu iş parçacığı bu tip gerçekten güçlü ve büyük ölçüde altında kullanılan IMHO olduğunu. Benim için bu web gerçek güçtür.

Ben umlaut ä, ö, ü, imi vb gibi özel karakterler bulunan PHP ile MySQL veri alırken aynı problem vardı bağlantısı sıfırlandı ve ben apache günlüğüne ne php günlükleri ya da hiçbir hata bulunamadı. Önce ben düzgün DB ayarlanan karakterleri erişilen PHP emin yaptı:

mysql_query("SET NAMES 'latin1' COLLATE 'latin1_german2_ci'");

mysql_query("SET CHARACTER SET 'latin1'");

Then, finally, I resolved the problem with this line in PHP:

mysql_query("SET character_set_connection='latin1'");

100,000 cURL istekleri?? Sen delisin. Veri Break Up!

Apache error_log neler var? Eğer bellek sınırına ulaşıyor?

EDIT: Eğer bellek sınırına ulaşan benziyor. Eğer PHP.ini erişimi var mı? Eğer öyleyse, can raise the memory_limit there. Değilse, exec or shell_exec fonksiyonlarını kullanarak kıvırmak veya wget ikilileri çalıştırmayı deneyin, bu şekilde bunlar PHP'nin bellek kullanarak değil, ayrı işlemler çalıştırabilirsiniz.