PHP cURL curl_multi_info_read() 函式



PHP 客戶端 URL curl_multi_info_read() 函式用於獲取由 curl_multi_exec() 函式處理的當前傳輸資訊。此函式允許您一次處理多個 cURL 傳輸,從而簡化了跟蹤哪些傳輸已完成以及完成進度。

語法

以下是 PHP cURL curl_multi_info_read() 函式的語法:

array curl_multi_info_read ( resource $mh [, int &$msgs_in_queue = null] )

引數

以下是 curl_multi_exec() 函式所需的引數:

  • $mh − 這是 curl_multi_init() 函式返回的控制代碼。

  • $msgs_in_queue − 這是一個可選引數,它接收佇列中的訊息數。

返回值

curl_multi_info_read() 函式返回一個包含傳輸資訊的陣列,例如控制代碼和狀態。如果發生錯誤,則返回 FALSE。

PHP 版本

此函式在核心 PHP 5 中引入,並與 PHP 7 和 PHP 8 相容。

示例 1

這是一個關於如何使用 PHP cURL curl_multi_info_read() 函式檢查單個 cURL 控制代碼狀態的基本示例。

<?php
   // Start a cURL multi handle
   $ch1 = curl_init("http://jsonplaceholder.typicode.com/todos/1"); // Replace the URL as per your need
   
   $mh = curl_multi_init();
   curl_multi_add_handle($mh, $ch1);

   $running_handles = null;
   do {
      curl_multi_exec($mh, $running_handles);
   } while ($running_handles > 0);

   $info = curl_multi_info_read($mh);
   if ($info !== false) {
      if ($info['result'] === CURLE_OK) {
         echo "Transfer completed successfully.";
      } else {
         echo "Error occurred: " . curl_strerror($info['result']);
      }
   }

   curl_multi_remove_handle($mh, $ch1);
   curl_multi_close($mh);
?> 

輸出

以下是以下程式碼的結果:

{ "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false }
Transfer completed successfully.

示例 2

在下面的 PHP 程式碼中,我們將使用 curl_multi_info_read() 函式來管理多個 cURL 控制代碼並接收傳輸完成資訊。

<?php
   // Array of URLs (Replace the URLs as per your requirement)
   $urls = [
       "https://abc.com/todos/1",
       "https://abc.com/todos/2",
       "https://abc.com/todos/3",
   ];
   
   $mh = curl_multi_init();
   $handles = [];
   
   foreach ($urls as $url) {
       $ch = curl_init($url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       curl_multi_add_handle($mh, $ch);
       $handles[] = $ch;
   }
   
   $running_handles = null;
   do {
       curl_multi_exec($mh, $running_handles);
   } while ($running_handles > 0);
   
   while ($info = curl_multi_info_read($mh)) {
       $handle = $info['handle'];
       $url_index = array_search($handle, $handles);
       if ($info['result'] === CURLE_OK) {
           echo "Transfer for {$urls[$url_index]} completed successfully.<br>";
       } else {
           echo "Error occurred for {$urls[$url_index]}: " . curl_strerror($info['result']) . "<br>";
       }
       curl_multi_remove_handle($mh, $handle);
       curl_close($handle);
   }
   
   curl_multi_close($mh);
?> 

輸出

這將生成以下輸出:

Transfer for https://abc.com/todos/3 completed successfully.
Transfer for https://abc.com/todos/2 completed successfully.
Transfer for https://abc.com/todos/1 completed successfully.

示例 3

現在,我們將使用 curl_multi_info_read() 函式來限制多控制代碼執行的持續時間。

<?php
   // Start the cURL handles (Replace the URLs as per your requirement)
   $ch1 = curl_init("http://abc.com/api/data1");
   $ch2 = curl_init("http://abc.com/api/data2");

   $mh = curl_multi_init();
   curl_multi_add_handle($mh, $ch1);
   curl_multi_add_handle($mh, $ch2);

   $timeout = 10; // Timeout in seconds
   $start_time = time();

   do {
      curl_multi_exec($mh, $running_handles);
      curl_multi_select($mh, 1); // Wait for 1 second
      $elapsed_time = time() - $start_time;
   } while ($running_handles > 0 && $elapsed_time < $timeout);

   while ($info = curl_multi_info_read($mh)) {
      $handle = $info['handle'];
      if ($info['result'] === CURLE_OK) {
         echo "Transfer completed successfully.<br>";
      } else {
         echo "Error occurred: " . curl_strerror($info['result']) . "<br>";
      }
      curl_multi_remove_handle($mh, $handle);
      curl_close($handle);
   }

   curl_multi_close($mh);
?> 

輸出

這將建立以下輸出:

404 - Not Found
404 - Not Found
Transfer completed successfully.
Transfer completed successfully.

總結

curl_multi_info_read() 是一個內建函式,用於獲取有關各個 cURL 傳輸的資訊,並在 PHP 中有效地管理多個傳輸。

php_function_reference.htm
廣告