0

介绍

目前我正在处理 XML 文件。使用 PHP,我结合了几个 XML 文件。这是一个超出 PHP 默认 memory_limit 的大操作。

当我用致命错误扩展限制时ini_set('memory_limit', '1024M');,脚本不再超过限制。

我现在遇到的问题是,在组合 XML 文件后,我的脚本有问题。浏览器加载无穷无尽,我仍然能够在服务器端做所有事情。就像我自己发电子邮件一样,向数据库中添加行。但是所有客户端都不起作用。像一个简单的echo 'Hello World';header('location: http://www.google.com');

在合并文件时,我记录了这些步骤。

$stores = $this->Store->getAll();
$this->log(2, 'all', 1337, 'Start processing ' . count($stores) . ' stores ';
foreach($stores as $store)
{
    $this->log(2, $store->id, 1337, 'Start processing store ';
    $this->process_store($store->id, false);
}
$this->log(2, 'all', 1337, 'Done with processing ' . count($stores) . ' stores ';
header('location: ' . BASE_URL . '/datatest');
die();

奇怪的是我的脚本确实记录了最后一个日志Done with processing。我在服务器端所做的任何事情都有效。

但是标题(重定向)却没有。我的浏览器只是无休止的加载。

问题

  • 出了什么问题?
  • 浏览器是否会在一段时间后禁用与服务器的通信?
4

3 回答 3

0

您可以通过使用 simpleXML 进行递归 XML 合并来规避内存问题

代码

<?php
private function mergeXML(&$base, $add)
{
    $new = $base->addChild($add->getName());
    foreach ($add->attributes() as $a => $b) {
        $new[$a] = $b;
    }
    foreach ($add->children() as $child) {
        $this->mergeXML($new, $child);
    }
}?>

用法

<?php mergeXML($xmlElement, simplexml_load_string($toMerge)) ?>

因此,您将开始并将 XML 1 与 XML2 合并到 TempXML1,然后将 TempXML1 与 XML3 合并,等等。这样,您只需查看 xml 文件列表,而无需将它们全部加载到内存中。

于 2012-11-09T11:57:44.260 回答
0

你确定 BASE_URL 。'/datatest' 是正确的 URL?您还应该在 Location 上加上大写 L 以确保重定向正常工作。

在不进行整个合并的情况下尝试此操作,以首先验证您的标头重定向是否有效。

于 2012-11-09T11:58:03.790 回答
0

我注意到服务器和客户端彼此断开连接。

最后我找到了解决方案,这真的很难看!

我必须sleep(1);在 foreach 循环内设置一个以保持服务器和客户端的连接。

天哪,这比以前慢了:'(

于 2012-11-13T15:34:50.960 回答