0

複数のPOSTREST 呼び出しを実行しようとしています。問題: 同時に複数の POST 呼び出しを行う。私は完全に認識しており、ライブラリを使用していますguzzleが、これを適切に行う方法を考え出していません。呼び出しを非同期に実行できますGETが、同じレベルのPOST呼び出しはできません。それから私は遭遇pthreadsし、ドキュメントを読み、それを開始する方法について少し混乱しました. 拡張子を付けてコンパイルphpしました。pthreads

誰かPOSTが同時に複数の呼び出しを実行し、後で操作するために応答を収集できるようにする方法をアドバイスできますか?

以下は、ループして待機する基本的な実装です。全体的に非常に遅い。

$postDatas = [
    ['field' => 'test'],
    ['field' => 'test1'],
    ['field' => 'test2'],
];

foreach ($postDatas as $postData) {
    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL            => "https://www.apisite.com",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING       => "",
        CURLOPT_MAXREDIRS      => 10,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST  => "POST",
        CURLOPT_POSTFIELDS     => json_encode($postData),
        CURLOPT_HTTPHEADER     => [
            "cache-control: no-cache",
            "connection: keep-alive",
            "content-type: application/json",
            "host: some.apisite.com",
        ],
    ));

    $response = curl_exec($curl);
    $err      = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        echo $response;
    }
}
4

1 に答える 1

1

タスクが API の操作に限定される場合、おそらくhttp://php.net/manual/ru/function.curl-multi-exec.phpを使用する必要があります。

public function getMultiUrl() {
    //If the connections are very much split the queue into parts
    $parts = array_chunk($this->urlStack, self::URL_ITERATION_SIZE , TRUE);

    //base options
    $options = [
        CURLOPT_USERAGENT => 'MyAPP',
        CURLOPT_HEADER => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
    ];

    foreach ($parts as $urls) {
        $mh = curl_multi_init();
        $active = null;
        $connects = [];
        foreach ($urls as $i => $url) {
            $options[CURLOPT_POSTFIELDS] = $url['postData']; 
            $connects[$i] = curl_init($url['queryUrl']);

            curl_setopt_array($connects[$i], $options);
            curl_multi_add_handle($mh, $connects[$i]);
        }

        do {
            $status = curl_multi_exec($mh, $active);
            $info = curl_multi_info_read($mh);
            if (false !== $info) {
                var_dump($info);
            }
        } while ($status === CURLM_CALL_MULTI_PERFORM || $active);

        foreach ($connects as $i => $conn) {
            $content = curl_multi_getcontent($conn);
            file_put_contents($this->dir . $i, $content);
            curl_close($conn);
        }
    }
}
于 2017-07-25T18:53:44.010 に答える