php 使用 SoapClient 提示 Could not connect to host
php使用的是7.2版本
项目框架使用的是 ThinkPhp 5.0.24
如图所示,提示错误 Could not connect to host
刚开始各种baidu、google网上的解决方案各种尝试
排错的问题
- php 7.2不行但是php7.4可以(但是框架原先是ThinkPhp5.0要升级到ThinkPhp5.1老代码要修改的量挺大,故放弃)
- 尝试试过用同样的框架来新建一个项目结果尝试可以,那就排查老项目中的composer扩展是否会有冲突影响的
- 最后尝试是否老项目的代码配置有问题,最后发现项目入口设置了 ini_set('default_socket_timeout', -1);
为什么 ini_set('default_socket_timeout', -1); 在7.2版本中会影响 Soap导致提示Could not connect to host 而 7.4的则不会
SOAP 扩展和库的变化
SOAP 扩展和相关库在不同版本的 PHP 中可能会有所不同。例如:
- PHP 7.2: 旧版本的 SOAP 扩展可能在处理超时时间时比较依赖于全局
default_socket_timeout
设置。如果这个设置被设置为-1
,可能导致 SOAP 请求无限期地等待。 - PHP 7.4: 新版本的 SOAP 扩展或相关库可能对超时处理有了改进或修复,能够更好地处理或忽略无效的超时设置。
不同的底层实现
PHP 的底层实现(例如使用的 socket 库或网络函数)可能在不同版本中有所不同。例如,PHP 7.4 可能使用了不同的网络库或者在处理超时设置时有了优化,使得 -1
不再像 PHP 7.2 那样显著地影响网络请求。
版本区别
- 错误处理:在 PHP 7.2 中,SOAP 错误处理不够一致,可能会导致错误消息不完整或者混淆。在 PHP 7.4 中,这些问题已被修复,并且提供了更清晰和一致的错误报告。
- WSDL 解析:在 PHP 7.4 中,对解析 WSDL 文件的方式进行了改进,提高了对复杂和大型 WSDL 文件的兼容性。
-
类型映射:在 PHP 7.4 中,对数据类型映射的处理进行了优化,包括对数组和对象类型的更好支持。
-
异步请求:PHP 7.4 引入了异步 HTTP 请求的支持,这可能会影响 SOAP 扩展的请求处理方式。
解决:
因为不确定 老代码中 ini_set('default_socket_timeout', -1); 哪里会用到,故在使用SoapClient前先 ini_set('default_socket_timeout', 30); 完成之后再置为 ini_set('default_socket_timeout', -1);
$url = "you url name"; $transData = "you data"; try { ini_set('default_socket_timeout', 30); $client = new \SoapClient($url); $result = $client->getResponse(["data" => $transData]); }catch (\SoapFault $e) { throw new Exception($e->getMessage()); } catch (\Exception $e) { throw new Exception($fault->getMessage()); } finally { ini_set('default_socket_timeout', -1); }