我有一些 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
不应该是问题。我该如何解决这个问题?
编辑: 看起来问题出在下面的代码中。事实上,如果我删除以下几行,我就不会再看到这个问题了。我希望这有帮助:
<a name="link" href="data:{$mimeType}/{$format};base64,{normalize-space(Attachment)}" download="{$attachmentName}">
<xsl:value-of select="attachmentName" />
</a>
附件本身是一个 base64 pdf 文件(在本例中是一个 ~1mb 字符串,但可能更多)
编辑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
编辑3:我尝试用
transformToURI
替换transformToXML
,但没有结果。 libxml_get_errors()
也没有显示任何结果。
您需要增加允许 PHP 在脚本中使用的内存量。首先打开您的
php.ini
文件。如果您不知道它位于哪里,请在终端中运行 php --ini
,或查找标题为 Loaded Configuration File
的行并进行编辑(您可能需要 sudo 访问权限)。
找到变量
memory_limit
并将其更改为更大的值。 (我把我的从128M改为512M)。
请注意这样做的潜在后果:您可能会遇到内存不足的问题。
您可以使用
解决此内存问题XMLReader
PHP 类而不是
DOM文档
如果您使用 Magento 框架,则可以使用
Laminas\Config\Reader\Xml
而不是
Magento\Framework\Xml\Parser
上课。
DOMDocument 类将尝试立即将所有 XML 内容加载到内存中,但 XMLReader 类不会立即将内容加载到内存中。它将增量读取 set 设置的节点。
您可以在本文中找到有关此内容的更多信息https://medium.com/devops-dev/way-to-read-large-xml-dataset-in-magento-2-using-laminas-config-reader -xml-2b59c936bbcc:)
干杯!