SoapClient ExecuteQuery завершается с ошибкой во второй раз - PullRequest
0 голосов
/ 08 мая 2018

Когда я запускаю этот метод в первый раз, он работает нормально, но во второй раз я получаю следующие предупреждения и ошибки:

Предупреждение: SoapClient :: __ call (): сбой выделения памяти: растущий буфер

Неустранимая ошибка: исключение Uncaught 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-кешей, но, похоже, он не справляется с этой задачей. Может кто-нибудь объяснить, что здесь происходит, и исправить эту проблему? Возможно, есть способ разделить этот запрос и сделать это «по кусочкам»?

По запросу я получаю около 30 000 товаров.

Это неправильно использовать $ soap-> ExecuteQuery? Не могу найти много информации об этом.

1 Ответ

0 голосов
/ 13 мая 2018

1) Используйте REST.

2) Может быть, было бы лучше и проще отправить все данные о продукции в виде одного заархивированного файла 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 товаров - это очень много, нескольких сотен товаров на одну страницу на один ответ будет вполне достаточно.

...