Функция PHP отключается по истечении времени ожидания соединения SoapClient :: __ doRequest

Я пытаюсь написать фоновую функцию, которая связывается с внешним 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.

Каково решение?

2

Решение

Вы можете контролировать время, необходимое вашему сценарию для подключения к удаленному хосту / службе, и время, в течение которого сокет-соединение должно ожидать ответа от сервера.

Первый параметр можно настроить, указав время ожидания при создании 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
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]