基於PHP的cURL快速入門(5)

2021-06-02 15:13:24 字數 2076 閱讀 4138

下面的**有點複雜了,因此我將一小步一小步地詳細解釋:

以下為引用的內容:

// 1. 批處理器

$mh = curl_multi_init();

// 2. 加入需批量處理的url

for ($i = 0; $i < $max_connections; $i++)

// 3. 初始處理

do while ($mrc == curlm_call_multi_perform);

// 4. 主迴圈

while ($active && $mrc == curlm_ok) while ($mrc == curlm_call_multi_perform);

// 7. 有資訊否?

// 12. 移除控制代碼

curl_multi_remove_handle($mh, $mhinfo['handle']);

curl_close($mhinfo['handle']);

// 13. 加入新url,幹活

if (add_url_to_multi_handle($mh, $url_list)) while ($mrc == curlm_call_multi_perform);}}

}}// 14. 完了

curl_multi_close($mh);

echo "==dead urls==\n";

echo implode("\n",$dead_urls) . "\n\n";

echo "==404 urls==\n";

echo implode("\n",$not_found_urls) . "\n\n";

echo "==working urls==\n";

echo implode("\n",$working_urls);

// 15. 向批處理器新增url

function add_url_to_multi_handle($mh, $url_list) else }

下面解釋一下以上**。列表的序號對應著**注釋中的順序數字。

新建乙個批處理器。created a multi handle.

稍後我們將建立乙個把url加入批處理器的函式 add_url_to_multi_handle() 。每當這個函式被呼叫,就有乙個新url被加入批處理器。一開始,我們給批處理器新增了10個url(這一數字由 $max_connections 所決定)。

執行 curl_multi_exec()  進行初始化工作是必須的,只要它返回 curlm_call_multi_perform 就還有事情要做。這麼做主要是為了建立連線,它不會等待完整的url響應。

只要批處理中還有活動連線主迴圈就會一直持續。

curl_multi_select() 會一直等待,直到某個url查詢產生活動連線。

curl的活兒又來了,主要是獲取響應資料。

檢查各種資訊。當乙個url請求完成時,會返回乙個陣列。

在返回的陣列中有乙個 curl 控制代碼。我們利用其獲取單個curl請求的相應資訊。

如果這是乙個死鏈或者請求超時,不會返回http狀態碼。

如果這個頁面找不到了,會返回404狀態碼。

其他情況我們都認為這個鏈結是可用的(當然,你也可以再檢查一下500錯誤之類...)。

從該批次移除這個curl控制代碼,因為它已經沒有利用價值了,關了它!

很好,現在可以另外加乙個url進來了。再一次地,初始化工作又開始進行...

嗯,該幹的都幹了。關閉批處理器,生成報告。

回過頭來看給批處理器新增新url的函式。這個函式每呼叫一次,靜態變數 $index 就遞增一次,這樣我們才能知道還剩多少url沒處理。

我把這個指令碼在我的部落格上跑了一遍(測試需要,有一些錯誤鏈結是故意加上的),結果如下:

以下為引用的內容:

共檢查約40個url,只耗費兩秒不到。當需要檢查更加大量的url時,其省心省力的效果可想而知!如果你同時開啟10個連線,還能再快上10倍!另外,你還可以利用curl批處理的無隔斷特性來處理大量url請求,而不會阻塞你的web指令碼。

基於PHP的cURL快速入門2

用post方法傳送資料 當發起get請求時,資料可以通過 查詢字串 query string 傳遞給乙個url。例如,在google中搜尋時,搜尋關鍵即為url的查詢字串的一部分 這種情況下你可能並不需要curl來模擬。把這個url丟給 file get contents 就能得到相同結果。不過有一...

php之快速入門學習 5 常量

常量值被定義後,在指令碼的其他任何地方都不能被改變。常量是乙個簡單值的識別符號。該值在指令碼中不能改變。乙個常量由英文本母 下劃線 和數字組成,但數字不能作為首字母出現。常量名不需要加 修飾符 注意 常量在整個指令碼中都可以使用。設定常量,使用 define 函式,函式語法如下 booldefine...

php快速入門

1 php 嵌入格式與注釋 推薦風格,採用的xml風格 採用簡短風格 採用script風格 採用asp格式 echo order processed.注意 1 注釋的作用範圍是注釋符之後,行結束或者關閉標記之前。2 在php中,換行,空格和tab都是被認為是空格,而且多個空格無效。2 表單變數的訪問...