Arhn - архитектура программирования

Клиент SOAP выдает ошибку памяти из-за большого ответа

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

$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

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

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

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

Пример:

<?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 "</pre>";


        // Option 2 Put current NODE contents into simpleXML object
        // $nodecontent = simplexml_load_string($xml->readOuterXML());
        // var_dump($nodecontent);

    }

}

18.07.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..