Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP cURL sync and async

I want to use PHP cURL in a project and in a scenario I need to send the data via cURL and wait for a response (and delay all code until a response is received in the cURL request) - sync request, and I also want in a different scenario to send the data async and not wait for the cURL request to be completed.

Is there a cURL parameter or function that I can use to send the data ASYNC and not wait for the response from the target URL to continue the code execution?

Here's my code for now, and the request is sync, by default, and the script waits until a response from the target URL is sent.

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result = curl_exec($ch);
curl_close($ch);

My application has two scenarios:

1) Data needs to be passed to a secondary server and once there is a confirmation that the server received it, continue the code execution in my application;

2) Data is passed to a secondary server, but the information passed is not so important, therefore we do not need to wait for a confirmation that the server received it, in order to continue. Thank you

like image 680
NVG Avatar asked Jul 29 '14 14:07

NVG


1 Answers

Here is an example from PHP Docs of how to use curl asynchronously:

<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();

// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//create the multiple cURL handle
$mh = curl_multi_init();

//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
//execute the handles
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>
like image 134
Sergey Onishchenko Avatar answered Sep 21 '22 10:09

Sergey Onishchenko