2013-02-11 81 views
1

我使用php函數返回超過1000個網站的狀態(即網站是上或下)。爲什麼curl_multi在我的本地主機上無法正常工作?

public function curlCheck($nodes) { 

    $results = array(); 
    $node_count = count($nodes); 

    $curl_arr = array(); 
    $master = curl_multi_init(); 

    for ($i = 0; $i < $node_count; $i++) { 
     $url = $nodes[$i]; 
     $curl_arr[$i] = curl_init($url); 
     curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl_arr[$i], CURLOPT_NOBODY, true); 
     curl_setopt($curl_arr[$i], CURLOPT_TIMEOUT, 5); 
     curl_multi_add_handle($master, $curl_arr[$i]); 
    } 

    $running = null; 
    do { 
     curl_multi_exec($master, $running); 
    } while ($running > 0); 


    for ($i = 0; $i < $node_count; $i++) { 
     $results[$i]['url'] = curl_getinfo($curl_arr[$i], CURLINFO_EFFECTIVE_URL); 
     $results[$i]['code'] = curl_getinfo($curl_arr[$i], CURLINFO_HTTP_CODE); 
     $results[$i]['time'] = curl_getinfo($curl_arr[$i], CURLINFO_PRETRANSFER_TIME); 
    } 
    echo 'done'; 
    return $results; 
} 

$nodes = array('http://google.com','http://yahoo.com','http://msn.com'); 
$result= curlCheck($nodes); 
print_r($result); 

雖然我用curl_multi,但這個過程的時間很長;我如何爲此執行並行處理。如果使用XAMPP或wampp

使用set_time_limit(0);;:

回答

0

嘗試此解決方案你的執行時間可能會突然結束;

class myclass 
{ 

public $multi_exec_curl_files = array(); 

//... 

public function name() 
{ 

//add urls to list 

foreach($array as $id => $value) 
$this->multi_exec_curl_files[] = array('link' => $value['link']); 

//... 

$this->multiCurl($this->multi_exec_curl_files); 


... 

} 

public function multiCurl($res = array(), $options = "") { 

     if (count($res) <= 0) 
      return False; 

     $handles = array(); 

     if (!$options) // add default options 
      $options = self::$options; 

     //print_r($options); 
     // add curl options to each handle 
     foreach ($res as $k => $row) { 
      $ch{$k} = curl_init(); 
      $options[CURLOPT_URL] = $row['link']; 
      //echo $row['link'].PHP_EOL; 
      curl_setopt_array($ch{$k}, $options); 
      $handles[$k] = $ch{$k}; 
     } 
     //die('d'); 

     $mh = curl_multi_init(); 

     foreach ($handles as $k => $handle) { 
      curl_multi_add_handle($mh, $handle); 
     } 

     $running_handles = null; 
     //execute the handles 
     do { 
      $status_cme = curl_multi_exec($mh, $running_handles); 
     } while ($status_cme == CURLM_CALL_MULTI_PERFORM); 
// 
     while ($running_handles && $status_cme == CURLM_OK) { 
      if (curl_multi_select($mh) != -1) { 
       do { 
        $status = curl_multi_exec($mh, $running_handles); 
       } while ($status == CURLM_CALL_MULTI_PERFORM); 
      } 
     } 

} 

把它從這裏;這個工程,我每天都在測試;根據需要添加該功能;

指南:

  1. 實例化類,區分大小寫

    $應用=新MyClass的();

  2. 運行主要功能

    $ APP->名稱();

在這個函數中,你必須做一個查詢,並從數據庫中提取所有的網站網址,並存儲在變量中的鏈接/屬性$this->multi_exec_curl_files;

我用$array作爲我的網站列表;

  1. 加載完所有的網址後,調用multi curl方法;

    $ this-> multiCurl($ this-> multi_exec_curl_files);

這將開始爲每個網站url一個執行線(句柄),它會做你說你做什麼;

我使用這種方法在同一時間下載多個網站的網頁,你可以用它來查看一個網站是否在線(多個網站);

$handles是在捲曲

$handle鏈接集合是一個URL

一旦這個過程開始時,它會等待,直到所有句柄完成;

+0

謝謝你的回覆, 你能寫一個關於如何使用這個類的例子嗎? – 2013-02-13 10:03:27

+0

沒問題;我在這裏如果你遇到麻煩 – 2013-02-13 10:03:58

+0

你能寫一個關於如何使用這個類的例子嗎? – 2013-02-13 10:09:52

0

根據https://bugs.php.net/bug.php?id=61141

在Windows中設置使用的libcurl版本7.24或更高版本(這似乎對應PHP 5.3.10或更高版本),你可能會發現curl_multi_select()總是返回-1,造成例如代碼在文檔中超時。顯然,這不是嚴重的錯誤:根據libcurl文檔,如果curl_multi_select返回-1,則應該添加自己的睡眠。

相關問題