簡體   English   中英

為什么 curl_errno() 在與 curl_multi_init() 組合出現錯誤時返回 0?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM