【问题标题】:PHP Wordpress Soap Client call with curl strange ErrorPHP Wordpress Soap 客户端调用带有 curl 奇怪错误
【发布时间】:2020-08-09 19:08:15
【问题描述】:

我正在开发一个非常简单的 wordpress 插件来连接到肥皂服务。它在我的本地主机上运行良好,但在生产主机上(我尝试了两个不同的)它返回此错误:

SoapClient Object ( [trace] => 1 [_exceptions] => [_stream_context] => Resource id #303 [_soap_version] => 1 [sdl] => Resource id #304 ) Fatal error: Uncaught Error: Call to a member function GetModelfunctions() on bool in /home/.sites/278/site7279787/web/jobs/wp-content/plugins/hrjobs/jobsview.php:14...

这是函数:

function hrjobsinit() {
    $wsdl = WSDL_PATH;
        $handle = curl_init($wsdl);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
        $response = curl_exec($handle);
        $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
    if ($httpCode > 399)
    {
        $client = null;
    }
    else
    {   
                $client = new SoapClient($wsdl, array(
                    'exceptions' => 0,
            'trace' =>true  
                ));
    }
        curl_close($handle);
    return $client;
}

我的本​​地主机是 PHP 版本 7.2.24-0ubuntu0.19.04.2、Apache/2.4.38、cURL 7.64.0

生产主机是 Linux 3.10.0-962.3.2.lve1.5.27.el6h.x86_64, cURL 7.61.0, 我注意到一些 cURL 东西在它不起作用的生产服务器中没有启用(IDN、TLS-SRP、PSL)。

【问题讨论】:

    标签: php wordpress curl soap soap-client


    【解决方案1】:

    只是在我正在测试的共享主机中未启用服务的端口(在本例中为 85)。第二件事不需要curl,可以直接调用SoapClient。

       try {
        $client = new SoapClient($wsdl, $options);
    } catch (SoapFault $fault) {
        var_dump($fault);
    }
    

    【讨论】:

      【解决方案2】:

      首先在 try/catch 块中设置 SoapClient 类的初始化。当发生错误时,SoapClient 会抛出一个异常作为 SoapFault 实例。只要您处于开发模式,就启用例外。这会让事情变得更容易。

      try {
          $client = new SoapClient($wsdl, $options);
      } catch (SoapFault $fault) {
          var_dump($fault);
      }
      

      您提供的错误消息说,您在 null 上调用了 Web 服务方法。所以我猜你的客户端的初始化没有成功。您是否检查过您的网站空间上是否有可用的 soap 扩展程序?要检查这一点,只需在您的网络空间上输出phpinfo() 并搜索soap/ext。如果您有权访问您的服务器,请按照此问题中的答案进行操作:How do I install soap extension? 否则请询问您的提供商,是否可以启用soap 扩展。

      【讨论】:

      • 谢谢 Marcel,我已经检查了 phpinfo 的 soap 扩展,它在我的本地机器和主机上都启用了 - 抱歉我没有提到。 Curl 正在两台机器上正确读取 wsdl 文件。在本地,SoapClient 也在按应有的方式获取所有数据。在托管环境中出了点问题,我就是不知道是什么。
      • 您的生产环境中的 http 代码是什么?为什么要使用 curl 来获取有关 wsdl 文件的信息,而不是直接将 wsdl 文件与 SoapClient 类一起使用?
      • 你说得对,你不需要 curl。但问题仍然存在。它在本地工作,但不在生产主机中。我实际上正在将现有的typo3 扩展重写为wordpress 插件。
      • 您是否遵循了 try/catch 提示?是否抛出异常,使用 wsdl 进行初始化?
      • omg 太尴尬了 85 端口没有启用。即所有端口都被禁用。这就是问题所在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多