Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SoapClient和https在长时间呼叫响应后出现错误500_Php_Soap Client - Fatal编程技术网

Php SoapClient和https在长时间呼叫响应后出现错误500

Php SoapClient和https在长时间呼叫响应后出现错误500,php,soap-client,Php,Soap Client,我花了很多时间,使用了很多建议,但都没有成功。 这是我的SoapClient初始化: ini_set('default_socket_timeout', 5000); $opts = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true )

我花了很多时间,使用了很多建议,但都没有成功。 这是我的SoapClient初始化:

ini_set('default_socket_timeout', 5000);
$opts = array(
    'ssl'   => array(
        'verify_peer'       => false,
        'verify_peer_name'  => false,
        'allow_self_signed' => true
    ),
    'https' => array(
        'timeout' => 6000,
    ),
    'http'  => array(
        'timeout' => 6000,
    )
);

$options = array(
    'encoding'           => 'UTF-8',
    'verifypeer'         => false,
    'verifyhost'         => false,
    'soap_version'       => SOAP_1_2,
    'trace'              => true,
    'exceptions'         => true,
    //'timeout' => 600, // not work use this: default_socket_timeout
    'connection_timeout' => 500,
    'stream_context'     => stream_context_create($opts),
    'cache_wsdl'         => WSDL_CACHE_NONE,
    //'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | SOAP_COMPRESSION_DEFLATE | 1, //with this: Invalid XML, timeout
    //'keep_alive' => true, //true - timeout, false - timeout
);

$errors = [];

try {
    $this->_client = new \SoapClient("https://{myip}/soap?wsdl", $options);
} catch (\Exception $e) {
    $errors[] = $e->getMessage();
} catch (\Throwable $e) { // SoapClient can "Fatal Error" before it throws a SoapFault, so by catching both errors and exceptions with Throwable you will have very simple error handling
    $errors[] = $e->getMessage();
}
还有我有问题的长途电话:

try {
    $result = $this->_client->__soapCall('route',
        [$myKey, $someController, $someAction, null]);
} catch (\SoapFault $e) {
    // handle issues returned by the web service
    $errors[] = $e->getMessage();
    return false;
} catch (\Exception $e) {
    // handle PHP issues with the request
    $errors[] = $e->getMessage();
    return false;
} catch (\Throwable $e) {
    // handle rest
    $errors[] = $e->getMessage();
}
有些响应还可以,但另一个响应需要更多的时间,它们会出现“内部服务器错误”HTTP 500。并在大约6-8秒后超时。 这是我发现的所有超时的服务器配置:

PHP Version 7.3.14
hard_timeout    2
ic24.api.max_timeout    7
memcache.lock_timeout   15
Read timeout    86400
default_socket_timeout  60  
opcache.force_restart_timeout   180
max_execution_time  30
我找到了这篇文章,但我不确定它是否在PHP>=7中修复。同时也看到互联网上有很多关于这个问题的问题

所有问题都出现在生产服务器Linux Centos上。在我当地的Xampp上一切正常。相同的配置。生产服务器与Suhosin和mod_security略有不同

我在htaccess中对此进行了测试,以禁用它:

<IfModule mod_security.c>
  SecRuleEngine Off
  SecFilterInheritance Off
  SecFilterEngine Off
  SecFilterScanPOST Off
  SecRuleRemoveById 300015 3000016 3000017
</IfModule>
但是没有运气

我试过了,但根本没用

我做了另一个这样的测试:

ini_set('default_socket_timeout', -1);
有些事情改变了。它不会等待响应,并且不会出错

已启用错误日志,但未记录任何错误

生产服务器是php fpm,与具有相同IP的SOAP服务器相同

更新1:

我在某个地方读到这样的评论:

请注意,尽管您可以尝试将默认\u套接字\u超时设置为 如果超过20秒,您可能会被Linux内核欺骗

tcp_syn_retries的默认值设置为5,这将 实际上,任何TCP连接都会在大约20秒后超时,不管是什么 您在PHP中设置的限制比这更高

该值只能由root更改,如下所示:

ini_set('default_socket_timeout', -1);
echo 6>/proc/sys/net/ipv4/tcp\u-syn\u重试

如上所述,值为6将使您的超时时间达到45秒

更新2:


当我通过cron调用同一个脚本时,就可以了。

查看您的php配置,最大执行时间和内存限制可能会增加,这可能会对您有所帮助。请查看php错误中是否有更具体的错误消息。log@Thomas更新。与此无关。我还有其他的脚本,只运行了几分钟。内存也被定义为非常高。请查看错误日志以了解确切的错误消息。错误日志已启用,但未记录任何错误。@Grumpy,如我所说。在本地dev xampp上,它运行良好。一些响应在几分钟后出现,但在开发服务器上出现问题。大约是超时时间,5秒后它会崩溃,因为timedout。我不知道还需要检查什么或设置什么才能工作。查看php配置,以最大执行时间和内存限制可能会增加,这可能会对您有所帮助。请查看php错误中是否有更具体的错误消息。log@Thomas更新。与此无关。我还有其他的脚本,只运行了几分钟。内存也被定义为非常高。请查看错误日志以了解确切的错误消息。错误日志已启用,但未记录任何错误。@Grumpy,如我所说。在本地dev xampp上,它运行良好。一些响应在几分钟后出现,但在开发服务器上出现问题。大约是超时时间,5秒后它会崩溃,因为timedout。我不知道还需要检查什么或者设置什么来工作。