Тайм-аут функции 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 на будущее.

Другие вопросы по тегам