Nasıl geçerli (ölü değil) bağlantılar programlama PHP kullanarak kontrol edebilirim?

8 Cevap php

URL'ler listesi göz önüne alındığında, ben her url kontrol etmek istiyorum:

  • 200 OK durum kodunu döndürür
  • Zaman X miktar dahilinde bir yanıt verir

Nihai hedef, bir yönetici bunları gözden böylece potansiyel olarak kırık adresler işaretleme yeteneğine sahip bir sistemdir.

PHP ile yazılmış olacak ve büyük olasılıkla cron üzerinden günlük olarak çalışacaktır.

Komut bir seferde yaklaşık 1000 adresler işleme alınacaktır.

Soru iki bölümden oluşur:

  • Ne sorunları içine çalıştırmak böyle bir operasyon ile herhangi bigtime FRİKİKLERİNDEN var mı?
  • Doğruluk ve performans dikkate alınarak PHP bir url durumunu kontrol etmek için en iyi yöntem nedir?

Çok teşekkürler zaman ayırdığınız için.

8 Cevap

PHP cURL uzantısı kullanın. Fopen aksine () aynı zamanda kontrol etmek için sayfanın tüm vücut indirmek zorunda değilsiniz gibi bir URL durumunu kontrol edin ve size bant genişliği bir ton kurtarmak için yeterli HTTP HEAD isteklerini yapabilirsiniz.

Bir başlangıç ​​noktası olarak bu gibi bazı işlevini kullanabilirsiniz:

function is_available($url, $timeout = 30) {
	$ch = curl_init(); // get cURL handle

	// set cURL options
	$opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser
				  CURLOPT_URL => $url,            // set URL
				  CURLOPT_NOBODY => true, 		  // do a HEAD request only
				  CURLOPT_TIMEOUT => $timeout);   // set timeout
	curl_setopt_array($ch, $opts); 

	curl_exec($ch); // do it!

	$retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK

	curl_close($ch); // close handle

	return $retval;
}

Ancak, olası optimizasyonlar bir ton var: Sen cURL örneğini yeniden kullanmak istiyorsanız ve host başına birden fazla URL kontrol eğer, hatta bağlantıyı yeniden kullanabilirsiniz.

Oh, ve bu kod HTTP yanıt kodu 200 için kesinlikle kontrol etmez Bu yönlendirmeler (302) takip etmez -. Ama aynı zamanda bunun için bir cURL-option var.

CURL içine bak. PHP için bir kütüphane var.

Bile bash komut dosyası yazabilirsiniz böylece cURL yürütülebilir versiyonu da bulunuyor.

Ben aslında 5k + URL'lerin bir veritabanı üzerinde yapar PHP şeyler yazdı. I getResponseCode () adında bir yöntemi vardır PEAR sınıfı HTTP_Request, kullanılır. Ben sadece getResponseCode geçirmeden, URL'ler üzerinden yineleme ve yanıtı değerlendirmek.

Ancak, FTP adresleri, (doğrulanmamış, ama ben bu durumda inanıyorum) http ya da https ile başlamayan URL'ler ve geçersiz güvenlik sertifikaları (a 0 bulunmazsa) ile siteler için çalışmaz. Ayrıca, bir 0 (bunun için hiçbir durum kodu yoktur) sunucuya-bulunamadı döndürülür.

Birkaç dosyaları içerir ve geriye bir tamsayı kodu almak için tek bir işlevi kullanmak gibi ve muhtemelen cURL daha kolay.

O curl için bir iş olabilir gibi görünüyor.

PHP Perl LWP takılıp değilseniz de bir cevap olabilir.

Ayrıca başka bir sayfaya yönlendirme 301 veya 302 HTTP yanıtları dönen URL'lerin farkında olmalıdır. Genellikle bu bağlantı geçersiz olduğu anlamına gelmez. Örneğin, http://amazon.com, 301 döner ve http://www.amazon.com/ yönlendirir.

Sadece bir 200 yanıtı dönen yeterli değildir; çok geçerli bağlantıları eski sahibi yenilemek başarısız olduğunda onlar porno / kumar portalları içine değiştirdikten sonra "200" dönmeye devam edecektir.

Domain gecekondular genellikle kendi alanlarındaki her URL 200 döner emin olun.

Bu komut dosyası üzerinde çalıştığı kutu Internet'e erişimi kalktığında siz sanatseverler içine çalışacak potansiyel bir sorun olduğunu ... 1000 false positive alırsınız.

Muhtemelen tarihin bir tür tutmak için komut için daha iyi olacak ve sadece başarısızlık 5 gün sonra bir hatayı bildirmek istiyorum.

Ayrıca, komut standart kontroller ile devam etmeden önce (bilinen iyi bir web sitesi kontrol gibi [google?]) Bir şekilde kendini kontrol olmalıdır.

Sadece bunu yapmak için bir bash komut dosyası gerekir. Benzer bir yazı benim cevabı kontrol ediniz here. Bu, büyük ölçüde hızını artırmak için HTTP bağlantıları kalıncaya geçici hataları n defa dener ve yönlendirmeleri takip tek yolcu gemisi.