我正在尝试编写一个与外部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
}
我想做的是创建一个解决方法,如果函数由于此连接超时而关闭,我想:
A) 执行一组新的操作,例如重新启动函数本身
或
B) 完全绕过错误,并在下一步中检查响应值。例如,如果 $result = NULL,则将绕过此函数中的其余项并返回 FALSE 值。
解决方案是什么?
您可以控制脚本连接到远程主机/服务所需的时间,以及套接字连接应等待服务器响应的时间。
第一个选项可以通过在创建 Soap 客户端时指定超时来配置:
$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
}
}