Php SoapClient和https在长时间呼叫响应后出现错误500
我花了很多时间,使用了很多建议,但都没有成功。 这是我的SoapClient初始化: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 )
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。我不知道还需要检查什么或者设置什么来工作。