Проблема в том, что я могу дать ф-ции массив из 100 заказов и она отработает нормально, но иногда может вернуть NULL (т.е. сам url возвращает нам NULL из-за того, что мы делаем много запросов насколько я понимаю).
Цель ф-ции: 20-30 запросах в минуту.
Как можно проверять, что вернулся NULL и повторять через 5 секунд запросы на которые вернулось NULL?
spoilerfunction Request ($data)
{
$url = "http://URL";
$multi = curl_multi_init();
$orders = [];
foreach ($data as $value)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 50); // нужно указывать проверку если вернулся false, то возвращать статус.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multi, $ch);
$orders[] = array(
'url' => $ch,
'Id' => $value
);
}
$active = null;
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi) == -1) {
usleep(10000);
// continue;
}
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
foreach ($orders as $order)
{
$result = json_decode(curl_multi_getcontent($order["url"]), true);
if (!empty($result)) {
// результат не пустой и я делаю записи в БД
}
curl_multi_remove_handle($multi, $order["url"]);
}
curl_multi_close($multi);
}
Я думаю конечно можно сделать что-то типа:
if (empty($result)) {
$array[] = $order["Id"];
}
....
return $array;
и потом вызывать ф-цию снова, но может есть лучшие варианты сделать это в самой ф-ции?)