我正在尝试编写一个与外部API通信的后台函数来检索&更新我们服务器上大约500,000条记录的信息。这需要时间来运行。我遇到的问题是来自foreach循环中调用的函数的这个PHP致命错误,它完全关闭了函数:
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值。
解决方案是什么?
答案 0 :(得分:0)
您可以控制脚本连接到远程主机/服务所需的时间以及套接字连接等待服务器响应的时间。
可以通过在创建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
}
}