Я должен назвать большое количество API одновременно. Я пытаюсь сделать это с помощью многопоточного завитка, но похоже, что он не смог получить все результаты API должным образом (некоторые ошибки, я думаю, что это тайм-аут ???), если я передаю ему много URL-адресов , Кажется, что 50 URL-адресов являются максимальными, которые я могу передать, и около 100 за раз, когда я действительно начинаю видеть проблемы. Из-за этого мне пришлось реализовать логику, чтобы обрезать URL-адреса, которые я пытаюсь скрутить в данный момент.Многопоточный завиток не может обрабатывать большое количество одновременных URL-адресов?
Вопросы:
- Что может быть причиной моих проблем локон?
- Есть ли что-то в curl, которое я могу настроить, чтобы сказать, что ждать больше ответов - на случай, если мои проблемы связаны с таймаутами?
- Есть ли что-то в моем сервере/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;
}
1 - это не многопоточность 2 - это, вероятно, тайм-аут PHP, который вы достигаете, а не фактический предел завивки –
1. Не является ли 'curl_multi_exec' многопоточным? 2. У меня есть 'set_time_limit (0);' выполняется перед вызовом этой функции. – StackOverflowNewbie
Голанг будет полезен здесь: D простой параллелизм. – Lansana