php - SoapClient ExecuteQuery 第二次失败
问题描述
当我第一次运行此方法时,它工作正常,但第二次,我收到以下警告和错误:
警告: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 有错吗?似乎找不到太多关于它的信息。
解决方案
1)使用休息。
2) 也许将所有产品数据作为 1 个存档的 CSV 文件发送会更好、更容易?
3)WSDL_CACHE_NONE
在某些情况下可能不起作用。尝试通过在脚本开头添加以下配置选项来禁用 SOAP 缓存:
ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
选项'features' => SOAP_SINGLE_ELEMENT_ARRAYS
可能很有用。
4)如果1-3项不合适,尝试为响应数据添加分页。30 000 个产品 - 非常多,一个响应一页几百个产品就足够了。
推荐阅读
- python - Python - 函数和执行顺序
- javascript - 扩展运算符获取数组内对象的单个属性 - JS/TS
- javascript - 在 Angular gridOptions 中调用另一个函数
- android - 如何从数据库中加载数据。UID-通知
- sql - 从 Oracle SQL 中的字符串中提取值
- flutter - flutter_blue 显示 mac 地址而不是 Names
- javascript - 通过 sec 变量 JAVASCRIPT 重新加载函数
- python - 如何从 PySpark 中的单个元素的 RDD 创建对 RDD?
- reactjs - 如何修复我的反应应用程序中的“未定义库”错误
- python - 自动编码器的 fit_generator 产生奇怪的结果