Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell when curl_multi_exec is done _sending_ data

I need to call a webservice from a PHP script. The web service is slow, and I'm not interested in its response, I only want to send data to it.

I'm trying to use curl_multi_exec (following an example here: http://www.jaisenmathai.com/articles/php-curl-asynchronous.html), and it's second parameter ($still_running) lets you know when its done sending AND receiving. But, again, I'm only interested in knowing when my script is done sending. Of course, if I exit the script before its done sending the data, the web service never registers receiving the request.

Another way to look at it is to detect when PHP is idle, waiting for a response from the server.

What I'd like to achieve is this dialogue:

  • PHP: Hi, please save this data
  • WS: Ok, ho hum, lets think about this.
  • PHP: Cya! (off to do something more important)
  • WS: Ok, Im done processing, here is your response... PHP? Where did you go? I feel used :(
like image 281
tomwoods Avatar asked Nov 13 '22 20:11

tomwoods


1 Answers

You can try

$url = "http://localhost/server.php";
$nodes = array();
$nodes["A"] = array("data" => mt_rand());   <-------- Random Data 
$nodes["B"] = array("data" => mt_rand());
$nodes["C"] = array("data" => mt_rand());
$nodes["D"] = array("data" => mt_rand());

    echo "<pre>";
$mh = curl_multi_init();
$curl_array = array();
foreach ( $nodes as $i => $data ) {
    $curl_array[$i] = curl_init($url);
    curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl_array[$i], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)');
    curl_setopt($curl_array[$i], CURLOPT_POST, true);
    curl_setopt($curl_array[$i], CURLOPT_POSTFIELDS, $data);
    curl_setopt($curl_array[$i], CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($curl_array[$i], CURLOPT_TIMEOUT, 15);
    curl_multi_add_handle($mh, $curl_array[$i]);
    echo "Please save this data  No : $i ", $data['data'], PHP_EOL;
}

echo PHP_EOL ,PHP_EOL;

$running = NULL;
do {
    usleep(10000);
    curl_multi_exec($mh, $running);
} while ( $running > 0 );
$res = array();
foreach ( $nodes as $i => $url ) {
    $curlErrorCode = curl_errno($curl_array[$i]);
    if ($curlErrorCode === 0) {
        $info = curl_getinfo($curl_array[$i]);
        if ($info['http_code'] == 200) { <------- Connection OK
            echo "Cya! (off to do something more important  No : $i Done", PHP_EOL;
            echo curl_multi_getcontent($curl_array[$i]) , PHP_EOL ;
        }
    }
    curl_multi_remove_handle($mh, $curl_array[$i]);
    curl_close($curl_array[$i]);
}
curl_multi_close($mh);

Output

Please save this data  No : A 1130087324
Please save this data  No : B 1780371600
Please save this data  No : C 764866719
Please save this data  No : D 2042666801


Cya! (off to do something more important  No : A Done
Ok, Im done processing, here is your response... 
    {"data":"1130087324"} PHP? Where did you go? 
    I feel used :(
113
Cya! (off to do something more important  No : B Done
Ok, Im done processing, here is your response... 
    {"data":"1780371600"} PHP? Where did you go? 
    I feel used :(
113
Cya! (off to do something more important  No : C Done
Ok, Im done processing, here is your response... 
    {"data":"764866719"} PHP? Where did you go? 
    I feel used :(
112
Cya! (off to do something more important  No : D Done
Ok, Im done processing, here is your response... 
    {"data":"2042666801"} PHP? Where did you go? 
    I feel used :(
113

Simple Test Server server.php

echo printf("Ok, Im done processing, here is your response... \n\t%s PHP? Where did you go? \n\tI feel used :(\n", json_encode($_REQUEST));
like image 59
Baba Avatar answered Nov 15 '22 13:11

Baba