2012-04-01 76 views
7

我試圖製作一個PHP腳本,它將盡可能快地檢查網站的HTTP狀態。比get_headers()更快的東西()

我目前正在使用get_headers()並從mysql數據庫的200個隨機URL中運行它。

要查看所有200 - 平均需要2分48秒。

有什麼我可以做的,使(它)更快?我知道fsockopen - 它可以在20多個站點上檢查80端口 - 但這與請求http狀態碼不同,因爲服務器可能會在端口上響應 - 但可能不會正確加載網站等)

這裏是代碼..

<?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; 
?> 

回答

6

你可以試試curl庫。可以在同一時間與CURL_MULTI_EXEC

實施例發送多個請求並行:

$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); 

修訂

看這個例子。 http://www.codediesel.com/php/parallel-curl-execution/

+1

嗨,我也嘗試使用cURL - 就像你發佈的代碼。但它是一樣的,事實上比get_headers()稍長一點; – Clarkey 2012-04-01 12:11:24

+1

嘗試做出多個請求,因爲我給上面的鏈接。例如每次10個請求 – safarov 2012-04-01 12:11:59

+0

+1不錯的一個!我不知道curl擴展可以並行處理請求。 – nnichols 2012-04-01 12:12:33

3

我不知道這是可以考慮的選擇,但你可以運行所有的人幾乎在同一使用叉子,這樣的腳本將只需要多一點的時間超過一個請求 http://www.php.net/manual/en/function.pcntl-fork.php

,你可以在在命令行模式下運行,並在同一時間推出的所有請求的腳本添加此,例如

編輯:你說你有200個電話要打,這樣的事情您可能會遇到數據庫連接丟失。該問題是由第一個腳本完成時鏈接被破壞的事實引起的。以避免您可以爲每個孩子創建一個新的連接。我看到你正在使用標準的mysql_ *函數,所以一定要傳遞第四個參數以確保每次都創建一個新的鏈接。還檢查您的服務器上同時連接的最大數量

+0

這就是我所追求的 - 我會看看你的鏈接,謝謝。 – Clarkey 2012-04-01 12:14:11

+0

@MattClarke好的,我很高興你覺得它很有用..你需要在迭代中運行分支,如果你在孩子身上,或者如果你在父母身上,可以繼續ping網站 – mishu 2012-04-01 12:17:02

+0

我不遵循你的說法 - 這個叉子生意對我來說是全新的,我甚至不知道這是可能的。 – Clarkey 2012-04-01 12:18:47

相關問題