SOAP-клиент выдает ошибку памяти при большом отклике - PullRequest
0 голосов
/ 05 декабря 2018

Я застрял со странной проблемой.Ниже моего кода:

$response = $client->__soapCall('ProcessXmlString', [['xmlRequest' => $xml]]);

XML выглядит примерно так:

<columns code="..">
    <column id="..">
        <field>...</field>
        <label>test</label>
        <visible>true</visible>
        <ask>false</ask>
        <operator>none</operator>
        <from></from>
        <to></to>
        <finderparam>...</finderparam>
    </column>
</columns>

Когда я запускаю этот код, я получаю ошибку памяти:

Разрешенная памятьразмер 134217728 байт исчерпан (попытался выделить 65183479 байт) ...

Как видите, ответ составляет всего около 60 МБ.Я думал, что SoapClient просто обрабатывать вещи кусками?(запрос с меньшим количеством данных работает отлично)

Я не хочу устанавливать предел памяти больше, но хочу обрабатывать ответ по частям.

Я не понимаю, почему эта ошибкапроизошло.У кого-нибудь есть идея / решение?

Я использую php версии 5.6 и SOAP версии 1.2

Заранее спасибо,

Нильс

1 Ответ

0 голосов
/ 18 июля 2019

Мой совет - использовать XMLREADER для больших (более 10 МБ) XML-файлов.

XML Reader - это так называемый pull-анализатор.Преимущество этого состоит в том, что вы можете начать синтаксический анализ без загрузки всей заливки в память (как это делает SimpleXML или DOMDocument).

Как только вы доберетесь до нужного уровня / узла, передайте эту часть xml вsimpleXML.

Пример:

<code><?php
$xml = new XMLReader;
$xml->open('example.xml');


$searchfor='Customer'; //nodename you're intending to find


while ($xml->read()){
    $nodename=$xml->localName;
    if ($nodename==$searchfor &&  $xml->nodeType == XMLReader::ELEMENT){ // does nodename match what we're looking for AND is it of type start elemenet (<example> but not </example>)

        ECHO '<hr>============= NODE FOUND ===================<br>';


        // Option 1
        //convert that into array so we can proceed with plain PHP
        $doc = new DOMDocument('1.0', 'UTF-8');
        $temp = simplexml_import_dom($doc->importNode($xml->expand(),true));
        $array = json_decode( json_encode($temp) , 1);


        echo "<pre>";
            print_r($array);
        echo "
"; // Вариант 2 Поместить текущее содержимое NODE в объект simpleXML // $ nodecontent = simplexml_load_string ($ xml-> readOuterXML ()); // var_dump ($ nodecontent);}}
...