[英]Why does curl_errno() return 0 when there was errors in combination with curl_multi_init()?
我有一個域列表,我想檢查它們是否處於活動狀態。 我可以分別檢查每一個,但我很難讓批次工作。
$c200= array();
$c301= array();
$c302= array();
$urls=array();
foreach (new SplFileObject("oList.txt") as $line) {
$urls[]=$line;
}
//print_r($urls);
$mh = curl_multi_init();
foreach ($urls as $key => $value) {
$ch[$key] =curl_init($value);
curl_setopt($ch[$key], CURLOPT_HEADER, true);
curl_setopt($ch[$key], CURLOPT_TIMEOUT, 10);
curl_multi_add_handle($mh, $ch[$key]);
}
do{
curl_multi_exec($mh, $running);
curl_multi_select($mh);
}while ($running > 0);
foreach (array_keys($ch) as $key) {
echo curl_getinfo($ch[$key], CURLINFO_HTTP_CODE);
echo "\n";
curl_multi_remove_handle($mh, $ch[$key]);
}
curl_multi_close($mh)
我寫了上面的代碼,但它給了我零作為輸出。 任何幫助,將不勝感激。
curl_errno()
在curl_multi
使用,則不會返回結果代碼。 現在看來,這是無證,但如果一個內部錯誤occures curl_multi()
則resources
將不會導致錯誤代碼,直到curl_multi_info_read()
被調用。 有一個引用錯誤/文檔請求: https : //bugs.php.net/bug.php?id=79318&thanks=4
通常,當我將0
作為響應代碼干擾時,我會遇到本地問題(dns、network、ssl、url ..)。
為了進一步挖掘,您可以檢查 curl 是否有執行錯誤。 這可以通過curl_errno()來檢查,它返回一個 curl 錯誤號和curl_error()它將返回一個描述性錯誤字符串。
錯誤代碼和錯誤消息可能是您可以在這里找到的其中之一: https : //curl.haxx.se/libcurl/c/libcurl-errors.html
編輯#2
如果您使用 curl_multi,則需要調用curl_multi_info_read()
一次以獲取結果代碼。 下面是如何獲取相關結果條目的示例。
// your code...
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
while ($result = curl_multi_info_read($mh)) {
if ($result['result'] == CURLM_OK) {
echo 'Success: ' . curl_getinfo($result['handle'], CURLINFO_HTTP_CODE) . "\n";
} else {
echo 'Error: ' . curl_strerror($result['result']) . "\n";
}
}
一個真正的測試現在將導致以下結果:
$ php test.php
Error: Couldn't resolve host name
Success: 200
Success: 200
編輯 #3
此外,似乎調用curl_multi_info_read($mh)
也可以解決問題,並將信息內部填充到您現有的句柄/資源中。
在我看來,這有點誤導。 我將向 php 創建一個錯誤/文檔報告,因為我找不到任何關於它的信息。 我只是在檢查 guzzle 是如何進行低級實現時偶然發現的。
// your code...
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
while ($result = curl_multi_info_read($mh)) {}
foreach($ch as $handle) {
echo "Handle: " . curl_errno($handle) . PHP_EOL;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.