php 使用 SoapClient 提示 Could not connect to host

 

php使用的是7.2版本

项目框架使用的是 ThinkPhp 5.0.24

如图所示,提示错误 Could not connect to host

 

刚开始各种baidu、google网上的解决方案各种尝试

排错的问题

  1. php 7.2不行但是php7.4可以(但是框架原先是ThinkPhp5.0要升级到ThinkPhp5.1老代码要修改的量挺大,故放弃)
  2. 尝试试过用同样的框架来新建一个项目结果尝试可以,那就排查老项目中的composer扩展是否会有冲突影响的
  3. 最后尝试是否老项目的代码配置有问题,最后发现项目入口设置了 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 那样显著地影响网络请求。

版本区别

  1. 错误处理:在 PHP 7.2 中,SOAP 错误处理不够一致,可能会导致错误消息不完整或者混淆。在 PHP 7.4 中,这些问题已被修复,并且提供了更清晰和一致的错误报告。
  2. WSDL 解析:在 PHP 7.4 中,对解析 WSDL 文件的方式进行了改进,提高了对复杂和大型 WSDL 文件的兼容性。
  3. 类型映射:在 PHP 7.4 中,对数据类型映射的处理进行了优化,包括对数组和对象类型的更好支持。

  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);
}

 

posted @ 2024-09-06 11:10  php的自我修养  阅读(44)  评论(0编辑  收藏  举报