2016-02-21 2 views
5

Я должен назвать большое количество API одновременно. Я пытаюсь сделать это с помощью многопоточного завитка, но похоже, что он не смог получить все результаты API должным образом (некоторые ошибки, я думаю, что это тайм-аут ???), если я передаю ему много URL-адресов , Кажется, что 50 URL-адресов являются максимальными, которые я могу передать, и около 100 за раз, когда я действительно начинаю видеть проблемы. Из-за этого мне пришлось реализовать логику, чтобы обрезать URL-адреса, которые я пытаюсь скрутить в данный момент.Многопоточный завиток не может обрабатывать большое количество одновременных URL-адресов?

Вопросы:

  1. Что может быть причиной моих проблем локон?
  2. Есть ли что-то в curl, которое я могу настроить, чтобы сказать, что ждать больше ответов - на случай, если мои проблемы связаны с таймаутами?
  3. Есть ли что-то в моем сервере/php.ini Я могу настроить для повышения производительности моего скрипта?

Вот сценарий:

function multithreaded_curl(array $urls, $concurrent_urls = 50) 
    { 
     // Data to be returned 
     $total_results = array(); 

     // Chunk the URLs 
     $chunked_urls = array_chunk($urls, $concurrent_urls); 
     foreach ($chunked_urls as $chunked_url) { 
      // Chunked results 
      $results = array(); 

      // Array of cURL handles 
      $curl_handles = array(); 

      // Multi-handle 
      $mh = curl_multi_init(); 

      // Loop through $chunked_urls and create curl handles, then add them to the multi-handle 
      foreach ($chunked_url as $k => $v) { 
       $curl_handles[$k] = curl_init(); 

       curl_setopt($curl_handles[$k], CURLOPT_URL, $v); 
       curl_setopt($curl_handles[$k], CURLOPT_HEADER, 0); 
       curl_setopt($curl_handles[$k], CURLOPT_RETURNTRANSFER, 1); 
       curl_setopt($curl_handles[$k], CURLOPT_SSL_VERIFYPEER, 0); 

       curl_multi_add_handle($mh, $curl_handles[$k]); 
      } 

      // Execute the handles 
      $running = NULL; 
      do { 
       curl_multi_exec($mh, $running); 
      } while ($running > 0); 

      // Get content and remove handles 
      foreach ($curl_handles as $k => $v) { 
       $results[$k] = json_decode(curl_multi_getcontent($v), TRUE); 
       curl_multi_remove_handle($mh, $v); 
      } 

      // All done 
      curl_multi_close($mh); 

      // Combine results 
      $total_results = array_merge($total_results, $results); 
     } 

     return $total_results; 
    } 
+0

1 - это не многопоточность 2 - это, вероятно, тайм-аут PHP, который вы достигаете, а не фактический предел завивки –

+0

1. Не является ли 'curl_multi_exec' многопоточным? 2. У меня есть 'set_time_limit (0);' выполняется перед вызовом этой функции. – StackOverflowNewbie

+0

Голанг будет полезен здесь: D простой параллелизм. – Lansana

ответ

4

относительно Q1: Как уже отметил, есть несколько вариантов, чтобы получить проблемы с этим Algorhythm. Прежде всего, он, вероятно, исчерпывает локальные (ручки и т. Д.), А также удаленные (maxConnections, maxThreads и т. Д.) Ресурсы. Не делай так.

относительно Q2: вам не нужно (см. Ниже), но, пожалуйста, получите ответы об ошибках перед ошибками догадки.

относительно Q3: есть да, на веб-сервере REMOTE есть несколько вариантов в зависимости от поставщика удаленного веб-сервера (ограничения на номера потоков, максимальное количество подключений, максимальное количество подключений на клиент и т. Д.). Если это также ваш сервер, вы можете настроить их для лучшего удовлетворения ваших потребностей, но сначала вы должны настроить клиентский алгоритм.

В целом, не имеет смысла запускать больше, чем несколько соединений за раз. Повторное использование соединений намного быстрее и не портит ваши локальные ручки и т. Д. И не делает атаки DOS для удаленных систем. Единственная причина для этого заключалась в том, что серверу требуется много времени для обработки запроса, чем требуется io.

Вы проверяли скорость, когда только делаете, скажем, 4 соединения за раз и повторно используете их вместо создания новых? Действительно, вы заселяете curl_handles [] за одно использование каждого из них. Время создания объектов ввода-вывода.

Смежные вопросы