PHP函数关闭SoapClient :: __ doRequest连接超时

时间:2014-11-16 22:07:25

标签: php function soap-client fatal-error

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

解决方案是什么?

1 个答案:

答案 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
    }
}