Тайм-аут функции PHP через 5 секунд
Я делаю вызов API для службы, и мне нужно тайм-аут вызова через 5 секунд и считать его "неудачным", а затем продолжить работу с кодом. Если время ожидания истекло, я хочу сохранить его в переменной $timeoutResult, а затем передать его обратно в javascript (я могу выполнить эту часть).
Я просто не уверен, как сделать таймерную функцию в PHP. Я видел документацию по set_time_limit(5)
но я не уверен, как это сделать?
Например:
$response = $api_calls->apiCall($endpoint, $data);
Если это занимает>5 секунд, я хочу, чтобы он завершил / посчитал вызов "неудачным", а затем продолжил обработку ошибок дальше по коду.
Я не уверен, как остановить выполнение ЭТОЙ функции, считая ее неудачной и продолжающей.
Будет ли что-то вроде этой работы?
set_time_limit(5);
$response = $api_calls->apiCall($endpoint, $data);
set_time_limit(0);
Таким образом, я устанавливаю тайм-аут (который начинается, когда вызывается эта функция внутри функции), он пытается выполнить, и если он завершает его, то устанавливает тайм-аут обратно в бесконечность?
Мои настройки cURL в apiCall() имеют стандартное время ожидания 10 секунд, но для этого одного конкретного вызова мне нужно, чтобы время ожидания истекло через 5 секунд, а затем отобразилось сообщение об ошибке, если оно истекло.
2 ответа
Вы не показали код, который фактически делает вызов API!
Хотя можно установить сторожевой таймер (SIGALRM), это только опция в системе POSIX и только при работе в sapi CLI.
Вы упоминаете, что код использует curl. У этого есть много вариантов управления тайм-аутами - _CONNECTTIMEOUT[_MS], _LOW_SPED_LIMIT, _LOW_SPEED_TIME и _TIMEOUT[_MS] - все они описаны в руководстве.
Я добавил дополнительный параметр в мой apiCall()
функция, которая принимает массив.
Затем я перебрал этот массив, используя
if(isset($extra_curl_options) && $extra_curl_options.length > 0){
foreach($extra_curl_options AS $k => $v) {
$http_request->setOption(constant($k), $v);
}
}
Это позволит мне передать несколько вариантов скручивания в apiCall на будущее.