PHP cURL curl_multi_info_read() Function



The PHP Client URL curl_multi_info_read() function is used to get the information about current transfers which are handled by the curl_multi_exec() function. This function allows you to handle many curl transfers at once, which makes it simple to keep track of which transfers are complete and at which point.

Syntax

Below is the syntax of the PHP cURL curl_multi_info_read() function −

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

Parameters

Following are the parameters required for the curl_multi_exec() function −

  • $mh − It is the handle returned by curl_multi_init() function.

  • $msgs_in_queue − It is an optional parameter which receives the number of messages in the queue.

Return Value

The curl_multi_info_read() function returns an array with information about the transfer like handle and status. If an error occurs, it returns FALSE.

PHP Version

This function was introduced in core PHP 5 and is compatible with PHP 7, and PHP 8.

Example 1

Here is the basic example of how to use the PHP cURL curl_multi_info_read() function to check the status of single cURL handle.

<?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);
?> 

Output

Here is the outcome of the following code −

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

Example 2

In the below PHP code we will use the curl_multi_info_read() function to manage multiple cURL handles and receive transfer completion information.

<?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);
?> 

Output

This will generate the below output −

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.

Example 3

Now we will use the curl_multi_info_read() function to limit the duration of the execution of multi handles.

<?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);
?> 

Output

This will create the below output −

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

Summary

The curl_multi_info_read() is a built-in function to get the information about individual cURL transfers and manage multiple transfers efficiently in PHP.

php_function_reference.htm
Advertisements