当我第一次运行此方法时,它工作正常,但第二次,我收到这些警告和错误:
警告:SoapClient :: __ call():内存分配失败:增长缓冲区
致命错误:未捕获的SoapFault异常:[发件人]看起来我们没有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缓存清除了缓存,但似乎它没有完成这项工作。 任何人都可以解释这里发生了什么,并解决这个问题? 是否有可能将这个请求分开并执行此操作&#34; chunk-wise&#34;?
我从请求中获得了大约3万种产品。
使用$ soap-&gt; ExecuteQuery是不对的?似乎无法找到有关它的更多信息。
答案 0 :(得分:0)
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' => SOAP_SINGLE_ELEMENT_ARRAYS
非常有用。
4)如果项目1-3不合适,请尝试为响应数据添加分页。 30 000种产品 - 非常多,每一回复一页的数百种产品就足够了。