【问题标题】:SoapClient ExecuteQuery fails the second timeSoapClient ExecuteQuery 第二次失败
【发布时间】:2018-05-08 12:30:38
【问题描述】:

当我第一次运行此方法时,它工作正常,但第二次,我收到以下警告和错误:

警告:SoapClient::__call():内存分配失败:缓冲区增长

致命错误:未捕获的 SoapFault 异常:[Sender] 看起来我们没有 XML 文档

当我“提供”时,它再次正常工作。

ini_set('memory_limit','1024M');
ini_set('soap.wsdl_cache_enabled', 0);
ini_set('soap.wsdl_cache_ttl', 0);

$xmlQuery = '<Query>
    <Select languages="'.$language.'">
        <Feature id="*"/>
    </Select>
    <From id="Product"/>
    <Where>
        <Clause id="AppType" operator="!=" value="" />
        <Clause id="MainGroup" operator="!=" value="" />
    </Where>
</Query>';

$request = 'http://localhost:8080/Products/getdata.asmx?wsdl';

$options = [
    'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
    'soap_version'=>SOAP_1_2,
    'cache_wsdl'=>WSDL_CACHE_NONE,
    'connection_timeout'=>15,
    'encoding'=>'UTF-8',
    'exceptions'=>true,
];

$soap = new \SoapClient($request, $options);
$res = $soap->ExecuteQuery(['query' => $xmlQuery]);
$re = new \SimpleXMLElement($res->ExecuteQueryResult);

我以为我已经使用 WSDL 缓存清除了缓存,但它似乎没有完成这项工作。 谁能解释这里发生了什么,并解决这个问题? 是否有办法拆分此请求并“按块”执行此操作?

我从请求中获得了大约 30 000 种产品。

使用$soap->ExecuteQuery有错吗?似乎找不到太多关于它的信息。

【问题讨论】:

  • 什么 PHP 版本和memory_limit 大小?
  • PHP 版本 7.2,memory_limit 大小为 1024M。之前有512M,不过只是改成1024M来测试。还是一样.. @camelsWriteInCamelCase
  • 我尝试使用 unset($res),但也没有工作

标签: php soap localhost simplexml soap-client


【解决方案1】:

1) 使用 REST。

2) 将所有产品数据作为 1 个存档 CSV 文件发送可能会更好、更容易?

3) WSDL_CACHE_NONE 在某些情况下可能不起作用。尝试通过在脚本开头添加以下配置选项来禁用 SOAP 缓存:

ini_set('soap.wsdl_cache_enabled', '0'); 
ini_set('soap.wsdl_cache_ttl', '0');

选项'features' =&gt; SOAP_SINGLE_ELEMENT_ARRAYS 很有用。

4)如果第1-3项不合适,请尝试为响应数据添加分页。 30 000 个产品 - 非常多,一个响应一页几百个产品就足够了。

【讨论】:

  • 测试 3,得到相同的错误。我不知道如何使用 1、2 或 3,抱歉。您能进一步提供帮助吗?
  • 我不是很擅长这个,对我来说有点新@camelWriteInCamelCase
  • 网上有很多关于这个的文章。如果您有任何具体问题,请向他们提问,本网站上的社区将始终提供帮助。
猜你喜欢
  • 2013-12-17
  • 2020-10-02
  • 2011-03-22
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2013-03-01
  • 2015-09-02
  • 2014-07-12
相关资源
最近更新 更多