7

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

8
  • 3
    Curl is always sync. Only thing u could do is set the timeout to a very low number or start the curl request on another thread with exec Commented Jul 29, 2014 at 14:46
  • You need to explain your asynchronous use-case to get a better idea of your options. For example, is the asynchronous operation doess not need to be fulfilled immediately (i.e. during script execution), you might consider setting up a queueing mechanism, where you just add an item to the queue and continue operations. However if you need operation to be completed during script execution (but in essence want to do work in parallel), you will likely need to look into forking that request from the main process. Commented Jul 29, 2014 at 15:10
  • @MikeBrant I have added some details to the bottom of my post. We need an async request so that the execution of our other code(from within same script) is not paused/delayed while waiting for the target server to respond to the cURL request. Commented Jul 29, 2014 at 15:31
  • @DarkBee - can you give me some idea about starting another thread with exec? Basically I think that if we do that, our code execution in the script that sends the cURL request will not be delayed and the main code will do its job and then the secondary thready will manage the cURL response. Commented Jul 29, 2014 at 15:33
  • @NVG If the information is not pertinent to the script execution, why not put the data into a queue for servicing? Commented Jul 29, 2014 at 15:33

2 Answers 2

3

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

?>
Sign up to request clarification or add additional context in comments.

Comments

0

Here example code to async call using curl:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);  

    curl_exec($ch); 
    curl_close($ch);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.