PHP 函数在 SoapClient::__doRequest 连接超时时关闭


PHP function shuts down on SoapClient::__doRequest connection timeout

我正在尝试编写一个与外部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
    }
}