2017-07-25 38 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