2017-07-25 130 views
1

我正在尝试执行多个POST REST调用。 捕获:同时进行多个POST调用。我完全知道,并已与图书馆guzzle合作,但我没有想通过这样做正确。我可以异步执行GET调用,但对POST调用没有任何相同级别的调用。然后我碰到了pthreads,我通读了文档,对于如何启动它还是有点困惑。我编译了phppthreads扩展名。对同一API端点执行多个同时POST调用

有人可能会建议如何在同一时间执行多个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; 
    } 
} 

回答

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); 
     } 
    } 
} 
+0

哪里是'$这个 - > urlStack'宣布?必须有一些代码丢失。 – MaryCoding

+0

是的,在这种情况下,它是通向文档存储的路径,它可以是基础或其他存储。 – Redr01d

相关问题