簡體   English   中英

PHP - 多個 curl 請求 curl_multi 速度優化

[英]PHP - multiple curl requests curl_multi speed optimizations

我正在使用 curl_multi 並行處理多個 API 請求。

但是,我注意到完成請求所需的時間有很大的波動。

這與 API 本身的速度有關,還是與我在 curl_multi_select 上設置的超時有關? 現在是0.05。 應該少嗎? 我怎么知道這個過程正在盡快完成請求,而不會在檢查之間浪費時間來查看它們是否完成?

 <?php 

        // Build the multi-curl handle, adding each curl handle
        $handles = array(/* Many curl handles*/);

        $mh = curl_multi_init();
        foreach($handles as $curl){
            curl_multi_add_handle($mh, $curl);
        }
            
        $running = null;
        do {
            curl_multi_exec($mh, $running);
            curl_multi_select($mh, 0.05); // Should this value be less than 0.05?
        } while ($running > 0);
      
        // Close the handles
        foreach($results as $curl){
            curl_multi_remove_handle($mh, $curl);
        }
        curl_multi_close($mh);

?>

當前 php 中curl_multi_select()的實現不會阻塞並且不尊重超時參數,也許以后會修復它。 您的代碼中沒有實現正確的等待方式,它必須是 2 個循環,我將發布一些來自我的機器人的測試代碼作為示例:

      $running  = 1;
      while ($running)
      {
        # execute request
        if ($a = curl_multi_exec($this->murl, $running)) {
          throw BotError::text("curl_multi_exec[$a]: ".curl_multi_strerror($a));
        }
        # check finished
        if (!$running) {
          break;
        }
        # wait for activity
        while (!$a)
        {
          if (($a = curl_multi_select($this->murl, $timeout)) < 0)
          {
            throw BotError::text(
              ($a = curl_multi_errno($this->murl))
                ? "curl_multi_select[$a]: ".curl_multi_strerror($a)
                : 'system select failed'
            );
          }
          if (!yield) {# ask for continuation
            throw BotError::skip();
          }
        }
      }

在那里您可以放置​​自定義超時而不是“要求繼續”,例如睡眠 200 毫秒。

正在做

        $running = null;
        for(;;){
            curl_multi_exec($mh, $running);
            if($running <1){
                   break;
            }
            curl_multi_select($mh, 1);
        }

應該會更好,那么當什么都沒有運行時,您將避免無用的 select() ..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM