我的PHP文件中有XML结构。
例如:
$file = file_get_contents($myFile);
$response = '<?xml version="1.0"?>';
$response .= '<responses>';
$response .= '<file>';
$response .= '<name>';
$response .= '</name>';
$response .= '<data>';
$response .= base64_encode($file);
$response .= '</data>';
$response .= '</file>';
$response .= '</responses>';
echo $response;
如果我创建.doc文件或其他扩展名并放入少量文本,它就可以了。但是,如果用户加载具有复杂结构的文件(不仅是文本) - XML只是不加载,而且我有一个没有错误的空文件。
但是同样的文件可以在我的其他服务器上运行。
我尝试使用simplexml_load_string
输出错误,但我没有错误。
PHP 5.3.3的服务器有问题; PHP 5.6的那个没有。如果我在本地服务器上尝试使用5.3.3,它就可以工作。
问题是由PHP版本造成的吗?如果是这样,究竟是怎么回事?
答案 0 :(得分:1)
您的代码中基本上可以改进三件事:
配置错误报告以实际查看错误消息。
使用适当的库生成XML,以确保您无法发送格式错误的数据。
内存使用保守(你当前将整个文件存储在RAM中三次,其中两个是纯文本表示,根据文件类型可能会大得多)。
您的整体代码可能是这样的:
// Quick code, needs more error checking and refining
$fp = fopen($myFile, 'rb');
if ($fp) {
$writer = new XMLWriter();
$writer->openURI('php://output');
$writer->startDocument('1.0');
$writer->startElement('responses');
$writer->startElement('file');
$writer->startElement('name');
$writer->endElement();
$writer->startElement('data');
while (!feof($fp)) {
// If I recall correctly, substring size must be multiple of 4
// to encode it properly (except for last part)
$writer->text(base64_encode(fread($fp, 10240)));
}
$writer->endElement();
$writer->endElement();
$writer->endElement();
fclose($fp);
}
我已尝试使用316 MB文件的此代码,并在我的PC上使用256 KB。
作为旁注,当文件很大时,在XML中插入二进制文件非常麻烦。它使提取成为问题,因为由于大量内存使用,您无法使用大多数常用工具。