Çok asılı / görmezden zaman aşımı cURL

2 Cevap php

Ben kullanıyorum bir çoklu cURL uygulanmasını 'yuvarlanan' (dayanarak, this SO post gibi this cURL code). Bu (evet, biliyorum, bu C ya da bir şey yazılmalıdır) cinleri olarak çalışan script 5 örnekleri ile, aynı anda 100 isteklerine kadar kullanarak URL binlerce işlemek için çalışıyor.

İşte sorun: (5 örnekleri arasında) işlem ~ 200.000 adresler curl_multi_exec() script tüm örneklerini kırmaya görünüyor sonra. Sonra yeniden başlatmadan, komut kapatılıyor denedim, ve aynı şey (ama hemen yeniden başlatmada değil, 200,000 URL'ler sonra) olur, komut dosyası curl_multi_exec() çağrı askıda kalıyor .

Ben her seferinde bir düzenli cURL tanıtıcısı işleme, 'tek' moduna script koymak, ve bu iyi çalışıyor (ama ihtiyacım oldukça hız değil). Benim günlüğü (her öylesine sık sık tekrar sonra asmak URL işlemek gibi görünüyor beri) yavaş / sorunlu bağlantıları bir yama vurmak ki şüphelenmek için bana yol, ama that would mean my CURLOPT_TIMEOUT bireysel kolları . Ya da belki sadece cURL ile birçok istekleri ile çalışan bir şey.

Anyone heard of anything like this?

Örnek kod (yine dayanan this):

//some logging shows it hangs right here, only looping a time or two
//so the hang seems to be in the curl call
while(($execrun = 
    curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);

//code to check for error or process whatever returned

I CURLOPT_TIMEOUT 120 ayarlandığında, ancak curl_multi_exec() nihayet bazı verileri döndürür durumlarda, bu bekleyen 10 dakika sonra bulunuyor.

Ben test / yapmak için henüz kontrol bir grup var, ama belki bu biriyle bir zili düşündüm.

2 Cevap

Çok test ettikten sonra, ben özellikle bu sorunun neden olduğunu bulduğuma inanıyorum. Ben sadece bu durumda sorunu yaşıyorum değil, diğer cevap yanlış olduğunu söylemiyorum.

Tüm DNS (hatası veya başarı) çözülene kadar ne söyleyebilirim itibaren, curl_multi_exec() döndürmez. Kötü etki ile URL'ler bir demet varsa curl_multi_exec(), en azından için geri gelmez:

(time it takes to get resolve error) * (number of urls with bad domain)

İşte başka birisi who has discovered this:

Curl çoklu fonksiyonları asenkron doğası üzerine bir not: DNS aramalarını (kadarıyla bugün bildiğimiz gibi) uyumsuz değildir. Senin grubun bir DNS araması başarısız olursa Yani, bundan sonra URL'lerin listesinde her şeyi de başarısız olur. Biz aslında bu günlük almak için bizim hosts.conf (sanırım?) Bizim sunucu üzerinde dosya güncellemek. Bunun yerine onları arıyor orada IP adreslerini alır. Ben henüz cURL değişti eğer emin değil üzerinde çalıştı, ancak ediliyor inanıyorum.

Ayrıca, test cURL (en azından benim versiyon) CURLOPT_CONNECTTIMEOUT ayarı takip eder göstermektedir. Her url çözmek ya da zaman aşımı için cURL bekler beri Tabii ki çok döngüsünün ilk adım yine, uzun bir zaman alabilir.

Senin sorunun releated olduğunu düşünüyorum:

(62) CURLOPT _TIMEOUT düzenli olarak çoklu ve multi_socket arayüzleri ile düzgün çalışmıyor. Iş çevresinde uygulamaları için zaman kadar bir kez, sadece kolay kolu kaldırmaktır.

Ayrıca bakınız: http://curl.haxx.se/bug/view.cgi?id=2501457

Bu durum ise, zaman aşımı için kıvrılma kolları izlemek ve çok havuzundan onları kaldırmanız gerekir.