XSLTProcessor::transformToUri(): не удалось выделить память: достигнут произвольный предел MAX_URI_LENGTH

У меня есть несколько файлов XML, которые мне нужно «преобразовать» в HTML и отобразить на экране.

Я разработал простой скрипт, который работает почти всегда, используя DOMDocument и XSLTProcessor.

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

XSLTProcessor::transformToUri(): Memory allocation failed : reaching arbitrary MAX_URI_LENGTH limit in /var/www/test/index.php on line 14

Это рабочая копия моего скрипта, который выдает ту же ошибку с теми же файлами.

<?php
$xslPath = 'test.xsl';
$xmlString = file_get_contents('test.xml');

$xml = new DOMDocument;
$xml->loadXML($xmlString);

$xsl = new DOMDocument;
$xsl->load($xslPath);

$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

$proc->transformToURI($xml, 'php://output');

Я попытался сохранить вывод в файл, но все же у меня возникла та же ошибка, поэтому php://output не должно быть проблемой. Как я могу решить эту проблему?

EDIT: Похоже, проблема заключается в следующем коде. На самом деле, если я удалю следующие строки, я больше не увижу проблему. Надеюсь, это поможет:

<a name="link" href="data:{$mimeType}/{$format};base64,{normalize-space(Attachment)}" download="{$attachmentName}">
    <xsl:value-of select="attachmentName" />
</a>

Само вложение представляет собой pdf-файл base64 (который в данном случае представляет собой строку размером ~ 1 МБ, но может быть и больше)

EDIT 2: Вот что произойдет, если я попытаюсь сгенерировать html с помощью команды xsltproc из командной строки:

xsltproc --stringparam target cora_cmd test.xsl test.xml > test.html
URI error : Memory allocation failed : reaching arbitrary MAX_URI_LENGTH limit
URI error : Memory allocation failed : escaping URI value

EDIT 3: я попытался заменить transformToURI на transformToXML, но безрезультатно. libxml_get_errors() тоже не показывает результатов.


person ToX 82    schedule 26.03.2020    source источник
comment
Пожалуйста, покажите XSLT и пример XML, так как это вызывает ошибку выделения памяти, а не PHP.   -  person Parfait    schedule 26.03.2020
comment
К сожалению, файл XSLT является закрытым, а XML содержит конфиденциальные пользовательские данные, поэтому я не могу опубликовать его здесь. Кроме того, размер XSLT составляет ~150 КБ, а размер XML — 1,2 МБ (в нем есть вложение base64). Есть ли что-нибудь, что я могу проверить в этих файлах?   -  person ToX 82    schedule 27.03.2020
comment
Вот почему мы просим образцы данных и кода для минимально воспроизводимого примера. Отредактируйте по мере необходимости или используйте мокапы. Все зависит от того, как вы трансформируетесь. Как и в любом языке программирования, существуют неэффективные способы выполнения даже простых задач.   -  person Parfait    schedule 27.03.2020
comment
На самом деле вы указали мне правильное направление, я думаю. Удаляя один фрагмент кода за другим, я изолировал проблему. Я обновляю исходный вопрос. Спасибо!   -  person ToX 82    schedule 27.03.2020
comment
Формат data URI для встроенных данных вместо ссылки на отдельный файл стал довольно популярным в последние годы, я не проверял, каково ограничение размера в текущих браузерах, но, возможно, библиотека libxslt или ее встраивание в PHP накладывает какое-то ограничение, которого нет. дольше адекватный. Однако поиск исходников PHP или исходников libxslt на GitHub по MAX_URI_LENGTH ничего не дает. Можете ли вы попробовать запустить свой XSLT через xsltproc, чтобы проверить, возникает ли та же ошибка?   -  person Martin Honnen    schedule 27.03.2020
comment
У меня нет файла base64 в виде отдельного файла, так как весь XML создается в другом месте. Мне просто нужно отображать его, когда это необходимо. Спасибо за идею xsltproc, я обновляю исходный вопрос   -  person ToX 82    schedule 27.03.2020
comment
Я добавил тег для libxslt, возможно, это заставит ваш вопрос увидеть кого-то, кто понимает, где установлен этот предел URI и есть ли у вас какой-либо способ его увеличить.   -  person Martin Honnen    schedule 27.03.2020


Ответы (1)


Вам нужно увеличить объем памяти, который PHP может использовать в скрипте. Начните с открытия файла php.ini. Если вы не знаете, где он находится, запустите php --ini в терминале или найдите строку под названием Loaded Configuration File и отредактируйте ее (вам может потребоваться доступ к sudo).

Найдите переменную memory_limit и измените ее на что-то большее. (Я поменял свой со 128M на 512M).

Остерегайтесь возможных последствий этого: вы можете столкнуться с проблемами нехватки памяти.

person Jack Crane    schedule 06.02.2021