5

PHP スクリプトから Web サービスを呼び出す必要があります。Web サービスは遅く、その応答には関心がありません。データを送信したいだけです。

私は curl_multi_exec を使用しようとしています (ここの例に従ってください: http://www.jaisenmathai.com/articles/php-curl-asynchronous.html )。2 番目のパラメーター ($still_running) は、AND の送信がいつ完了したかを知らせます。受け取ります。しかし、ここでも、スクリプトの送信がいつ完了したかを知りたいだけです。もちろん、データの送信が完了する前にスクリプトを終了すると、Web サービスはリクエストの受信を登録しません。

これを確認するもう 1 つの方法は、PHP がアイドル状態で、サーバーからの応答を待っていることを検出することです。

私が達成したいのは、このダイアログです:

  • PHP: こんにちは、このデータを保存してください
  • WS: わかりました、うーん、これについて考えてみましょう。
  • PHP: シア! (もっと重要なことをするためにオフ)
  • WS: わかりました。処理が完了しました。これがあなたの応答です... PHP? あなたは何処に行きましたか?慣れた感じです:(
4

1 に答える 1

1

あなたが試すことができます

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

出力

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

シンプルなテスト サーバー 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));
于 2012-10-16T15:04:35.547 に答える