Я нашел здесь функцию: http://archevery.blogspot.com/2013/07/php-curl-multi-threading.html
Я использую ее для отправки массива URL-адресов для запуска и обработки как можно быстрее с помощью многопоточных запросов curl. Это прекрасно работает.
НЕКОТОРЫЕ из URL, которые я хочу отправить, требуют, чтобы они обрабатывались по порядку, не в одно и то же время, а в последовательности.
Как этого добиться?
Пример:
URL-A URL-B URL-B- C -> Все функции отключаются одновременно
URL-D URL-E -> Должен дождитесь окончания действия URL-D sh, прежде чем URL-E сработает.
Моя цель - создать систему управления задачами, которая позволит мне добавлять PHP приложений в качестве «Задач» в базу данных. У меня есть отношение заголовка / детализации с задачами, поэтому задача с одним заголовком и одной деталью может быть отослана многопоточно, но задача с одним заголовком и несколькими деталями должна отсылаться в порядке задач детализации.
Я могу сделать это, вызывая запросы curl в al oop, но я хочу, чтобы они также запускали базовый запрос (первую задачу последовательности) как часть многопоточной функции. Я не хочу ждать, пока все последовательные задачи накапливаются и обрабатываются по порядку. Как и в первом задании, каждая последовательность должна быть многопоточной, но задачи с последовательностью должны ждать завершения этой задачи, прежде чем переходить к следующей.
Я попробовал эту функцию, чтобы отправить несколько задач до, но он ждет, пока каждая задача завершится sh, прежде чем перейти к следующей. Мне нужно как-то объединить многопоточную функцию из приведенного выше URL с этой. Вот моя многопоточная функция скручивания:
function runRequests($url_array, $thread_width = 10) {
$threads = 0;
$master = curl_multi_init();
$curl_opts = array(CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_TIMEOUT => 15,
CURLOPT_RETURNTRANSFER => TRUE);
$results = array();
$count = 0;
foreach($url_array as $url) {
$ch = curl_init();
$curl_opts = [CURLOPT_URL => $url];
curl_setopt_array($ch, $curl_opts);
curl_multi_add_handle($master, $ch); //push URL for single rec send into curl stack
$results[$count] = array("url" => $url, "handle" => $ch);
$threads++;
$count++;
if($threads >= $thread_width) { //start running when stack is full to width
while($threads >= $thread_width) {
//usleep(100);
while(($execrun = curl_multi_exec($master, $running)) === -1){}
curl_multi_select($master);
// a request was just completed - find out which one and remove it from stack
while($done = curl_multi_info_read($master)) {
foreach($results as &$res) {
if($res['handle'] == $done['handle']) {
$res['result'] = curl_multi_getcontent($done['handle']);
}
}
curl_multi_remove_handle($master, $done['handle']);
curl_close($done['handle']);
$threads--;
}
}
}
}
do { //finish sending remaining queue items when all have been added to curl
//usleep(100);
while(($execrun = curl_multi_exec($master, $running)) === -1){}
curl_multi_select($master);
while($done = curl_multi_info_read($master)) {
foreach($results as &$res) {
if($res['handle'] == $done['handle']) {
$res['result'] = curl_multi_getcontent($done['handle']);
}
}
curl_multi_remove_handle($master, $done['handle']);
curl_close($done['handle']);
$threads--;
}
} while($running > 0);
curl_multi_close($master);
return $results;
}
, а вот однопоточная функция скручивания.
function runSingleRequests($url_array) {
foreach($url_array as $url) {
// Initialize a CURL session.
$ch = curl_init();
// Page contents not needed.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
// grab URL and pass it to the variable.
curl_setopt($ch, CURLOPT_URL, $url);
// process the request.
$result = curl_exec($ch);
}
Оба принимают массив URL в качестве входных данных.
В настоящее время у меня есть массив всех отдельных задач и еще один массив всех нескольких задач с «идентификатором заголовка», который позволяет мне узнать, к какой задаче заголовка относится каждая задача детализации.
Любая помощь по теории или коду будет наиболее ценится. Спасибо!