PHP / Curl: KAFA Talep bazı sitelerde uzun zaman alır

5 Cevap php

Ben bir URL için bir baş isteği yapar ve sonra yanıt başlıklarını yazdıran basit bir kod var. Bazı sitelerde, bu tamamlanması uzun zaman alabilir fark ettik.

Örneğin, talep http://www.arstechnica.com yaklaşık iki dakika sürer. Ben aynı temel görevi yapan başka bir web sitesini kullanarak aynı isteği denedim, ve hemen geri geliyor. Yani bu gecikmeye sebep oluyor yanlış ayarlanmış bir şey var olmalıdır.

İşte var kod:

$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

// Only calling the head
curl_setopt($ch, CURLOPT_HEADER, true); // header will be at output
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'

$content = curl_exec ($ch);
curl_close ($ch);

http://www.seoconsultants.com/tools/headers.asp: İşte gelmez aynı işlevi web sitesine bir link

Yukarıdaki kod, en azından benim sunucuda, www.arstechnica.com almak için iki dakika sürer, ancak yukarıda linkten servis hemen döndürür.

Ne eksik?

5 Cevap

Bunu biraz daha basitleştirilmesi deneyin:

print htmlentities(file_get_contents("http://www.arstechnica.com"));

Benim webserver anında yukarıdaki çıkışları. Senin üzerinde değilse, web konak istekleri bu tür kısma yerde ayarı bir çeşit iyi bir şans var.

EDIT:

Yukarıda sizin için anında olur bu yana, orijinal kodu this curl setting ayarlamayı deneyin:

curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);

Deftere aracını kullanarak, http://www.arstechnica.com kendisine gönderilen herhangi bir istek için gönderilen 301 başlık olduğunu fark ettim. Bu cURL script asmak için neden bu nedenle, bu almak ve buna belirtilen yeni Konumu uymadığını mümkündür.

SECOND EDIT:

İlginçtir ki, sen benim webserver çok asmak yapma yukarıda var aynı kod çalışıyor. Ben bu kodu yerine:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'

Bu grubu:

curl_setopt($ch, CURLOPT_NOBODY, true);

Yolu olan the manual, bir HEAD isteği yapmak önerir. Bu anında çalışma yaptı.

Sen KAFA web sunucusuna sadece bir öneri olduğunu hatırlamak zorunda. KAFA doğru olanı yapmak için sık sık yöneticileri adına bazı açık çaba alır. Eğer statik bir dosya Apache (veya ne olursa olsun web sunucusu) baş eğer sık ​​sık bir adım olacaktır doğru olanı yapmak. Bir dinamik sayfa başlığının ise, çoğu kurulumları için varsayılan, GET yolu yürütmek tüm sonuçları toplamak, ve sadece içerik olmadan başlıklarını geri göndermektir. Bu uygulama, 3 (veya daha fazla) katmanlı kurulum ise, bu çağrı potansiyel bir HEAD bağlam için çok pahalı ve gereksiz olabilir. Örneğin, bir Java servlet üzerinde, varsayılan doHead tarafından () sadece) (doGet çağırır. Uygulama için biraz daha akıllı bir şey yapmak için geliştirici açıkça doHead () uygulamak (ve daha sık, onlar değil) gerekir.

Ben fiyat bilgisi birkaç yüz megabayt indirmek için kullanılan bir Fortune 100 şirketi bir uygulamayı karşılaştı. Değiştirilme tarihi değişti kadar biz oldukça düzenli HEAD istekleri yürütme tarafından bu verilere güncellemeleri kontrol ediyorum. Bu istek aslında uç Bu da listeyi biz birkaç iç sunucuları arasında kendi arka ucunda ve bunun havalesine gigabayt veri ilgili istekte her zaman oluşturmak için çağrı geri vereceğini çıkıyor. Onlar bizimle korkunç mutlu değildi ama biz kullanma durumu açıkladı kez onlar hızla alternatif bir çözüm ile geldi. Onlar yerine sahte bunu kendi web sunucusunda güvenmek yerine HEAD, uygulamaya olsaydı, bu bir sorun olmazdı.

Ben yönlendirilen URL'yi öğrenmek için aşağıdaki fonksiyon kullanılır.

$head = get_headers($url, 1);

İkinci argüman tuşları ile bir dizi döndürür yapar. Için, örneğin Aşağıdaki Location değerini verecektir.

$head["Location"]

http://php.net/manual/en/function.get-headers.php

Hafızam beni CURL 1.0 için HTTP protokolü sürümünü (burada yavaş ve muhtemelen suçlu parçası olduğu) bu değiştirmeyi deneyin değiştiren bir HEAD isteği yaparken başarısız değilse:

$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

// Only calling the head
curl_setopt($ch, CURLOPT_HEADER, true); // header will be at output
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // ADD THIS

$content = curl_exec ($ch);
curl_close ($ch);

Bu:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

I wasn't trying to get headers.
I was just trying to make the page load of some data not take 2 minutes similar to described above.
That magical little options has dropped it down to 2 seconds.