Я пытаюсь написать фоновую функцию, которая связывается с внешним API для извлечения & обновить информацию о 500 000 записей на нашем сервере. Это требует времени для запуска. Проблема, с которой я сталкиваюсь, заключается в фатальной ошибке PHP, вызванной функцией внутри цикла foreach, которая полностью закрывает функцию:
SoapClient::__doRequest(): connect() failed: Connection timed out in /path/to/function on line ABC
Вот фиктивная версия функции, с указанием строки, в которой выдается фатальная ошибка, выключающая функцию:
private function APIUpdateFunction($table,$record,$fields,$data) {
$soap = new SoapClient("https://www.endpoint.com/API/stuff.whatever");
$result = $soap->UpdateRecord(array(
"credentials" => API_CREDS,
"table" => $table,
"record" => $record,
"fields" => $fields,
"data" => $data
)); // THIS IS WHERE THE FATAL ERROR IS BEING THROWN
}
То, что я хотел бы сделать, это создать обходной путь, при котором, если функция отключается в результате этого тайм-аута соединения, я хотел бы либо:
А) Выполните новый набор действий, таких как перезапуск самой функции
или же
Б) Полностью обойти ошибку и проверить на следующем шаге значение ответа. Например, если $ result = NULL, остальные элементы в этой функции будут пропущены и вернут значение FALSE.
Каково решение?
Вы можете контролировать время, необходимое вашему сценарию для подключения к удаленному хосту / службе, и время, в течение которого сокет-соединение должно ожидать ответа от сервера.
Первый параметр можно настроить, указав время ожидания при создании Soap Client:
$client = new SoapClient($wsdl, array("connection_timeout"=>15));
Второй вариант можно настроить с помощью:
ini_set('default_socket_timeout', 180);
Теперь, если вы хотите отловить ошибку тайм-аута во время соединения с хостом или сокета, вы должны перехватить SoapFault
исключение, например:
private function APIUpdateFunction($table,$record,$fields,$data)
{
try {
$soap = new SoapClient("https://www.endpoint.com/API/stuff.whatever");
$result = $soap->UpdateRecord(array(
"credentials" => API_CREDS,
"table" => $table,
"record" => $record,
"fields" => $fields,
"data" => $data
)); // THIS IS WHERE THE FATAL ERROR IS BEING THROWN
} catch (SoapFault $e) {
// There was an error with the Soap Client
// Do something here
}
}
Других решений пока нет …