XML无法加载,没有任何错误消息

时间:2017-01-19 08:32:55

标签: php xml server

我的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版本造成的吗?如果是这样,究竟是怎么回事?

1 个答案:

答案 0 :(得分:1)

您的代码中基本上可以改进三件事:

  1. 配置错误报告以实际查看错误消息。

  2. 使用适当的库生成XML,以确保您无法发送格式错误的数据。

  3. 内存使用保守(你当前将整个文件存储在RAM中三次,其中两个是纯文本表示,根据文件类型可能会大得多)。

  4. 您的整体代码可能是这样的:

    // 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中插入二进制文件非常麻烦。它使提取成为问题,因为由于大量内存使用,您无法使用大多数常用工具。