2012-04-01 29 views
7

Bir web sitesinin HTTP durumunu olabildiğince hızlı kontrol eden bir PHP betiği yapmaya çalışıyorum.get_headers'den daha hızlı bir şey()

Şu anda get_headers() yöntemini kullanıyorum ve bunu mysql veritabanından 200 rastgele bir URL'de çalıştırıyorum.

Tüm 200'ü kontrol etmek için - ortalama 2m 48s alır.

Bunu daha hızlı yapmak için yapabileceğim bir şey var mı (çok)?

(Ben fsockopen hakkında biliyorum - 20s 200 sitede 200 bağlantı noktasını kontrol edebilirsiniz - ancak sunucu bağlantı noktasında yanıt verebileceğinden, http durum kodu istemekle aynı değildir, ancak web siteleri doğru şekilde yüklenmiyor olabilir) İşte

<?php 
    function get_httpcode($url) { 
    $headers = get_headers($url, 0); 
    // Return http status code 
    return substr($headers[0], 9, 3); 
    } 

    ### 
    ## Grab task and execute it 
    ### 


    // Loop through task 
    while($data = mysql_fetch_assoc($sql)): 

     $result = get_httpcode('http://'.$data['url']); 
     echo $data['url'].' = '.$result.'<br/>'; 

    endwhile; 
?> 

cevap

6

Sen CURL kütüphanesi deneyebilirsiniz .. kodudur. Sen CURL_MULTI_EXEC

Örnek ile aynı anda birden fazla istek paralel gönderebilirsiniz:

$ch = curl_init('http_url'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
$c = curl_exec($ch); 
$info = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
print_r($info); 

bu örneği Look

GÜNCELLEME. http://www.codediesel.com/php/parallel-curl-execution/

+1

Merhaba, cURL kullanmayı da denedim - gönderdiğiniz koddaki gibi. Ama aynı, infiltre get_headers(); – Clarkey

+1

Yukarıdaki bağlantıyı verdiğim için çok istekte bulunmayı deneyin. Örneğin, zaman başına 10 istek – safarov

+0

+1 Güzel biri! Curl uzantısının paralel olarak istekleri işleyebileceğini bilmiyordum. – nnichols

3

hemen hemen aynı bir çatal kullanarak bu düşünebileceğiniz bir seçenek ise bilmiyorum ama hepsini çalıştırabilir, bu şekilde komut bir istek daha uzun sadece biraz sürecektir http://www.php.net/manual/en/function.pcntl-fork.php

örneğin, cli modunda koştu ve aynı anda tüm isteklerini başlatmak bir komut

düzenle bu ekleyebilirsiniz: Eğer yapmak 200 aramaları, bu nedenle bir şey olduğunu söylemek veritabanı bağlantı kaybı yaşayabilirsiniz. Sorun, ilk komut tamamlandığında bağlantının yok olduğu gerçeğinden kaynaklanır. Bundan kaçınmak için her çocuk için yeni bir bağlantı yaratabilirsiniz. Standart mysql_ * işlevlerini kullandığınızı görüyorum, bu yüzden her seferinde yeni bir bağlantı oluşturduğunuzdan emin olmak için 4. parametreyi geçtiğinizden emin olun. Ayrıca sunucunuzdaki eş zamanlı bağlantıların maksimum sayısını da kontrol edin

+0

İşte peşindeyim - Bağlantınıza bir göz atacağım, teşekkürler. – Clarkey

+0

@MattClarke tamam, yararlı bulduğunuza sevindim .. Çocuğunuz varsa ya da çocuğunuz varsa – mishu

+0

ben 'de devam ederseniz, sonuçları aldığınız ve siteye ping atabileceğiniz yinelemede çatalı çalıştırmanız gerekir.' Söylediklerinizi takip etmeyin - bu çatal işi benim için tamamen yeni, mümkün olduğunu bilmiyordum bile. – Clarkey