【问题标题】:Processing XML file in PHP and send data little by little用PHP处理XML文件并一点一点发送数据
【发布时间】:2016-10-12 11:43:34
【问题描述】:

我正在尝试读取 Symfony 项目中的 XML 文件,以将数据发送到前端。

由于 XML 文件很大,我正在使用 XMLReader 和 SimpleXML 的组合(如此线程中所建议:How to use XMLReader in PHP?)。

这是我的 XML 阅读器代码:

class XMLReader {

private $xmlFile;
private $reader;

public function __construct($xmlFile = null)
{
    $this->xmlFile = $xmlFile;
}


public function initReader()
{
    $this->reader = new \XMLReader();
    $this->reader->open($this->xmlFile);
}

public function getData()
{
    $products = array();
    $index = 0;
    while ($this->reader->read()) {
        while ($this->reader->name === 'product') {
            $node = new \SimpleXMLElement($this->reader->readOuterXML());
            array_push($products, $node);
            $index++;
            if ($index < 20)
                $this->reader->next();
            else
                break 2;
        }
    }
    return $products;
}

我的目标是一点一点地发送数据,因为它们将显示在带有分页的表格中。也就是说第一次会发送20个结果,然后当我们点击第2页时,它会请求接下来的20个结果。

有没有办法做到这一点?

【问题讨论】:

  • 这并不是一个好主意,因为这基本上意味着您必须解析 xml 文件每次请求表中的新页面。相反,您可以处理整个文件并传输它,然后使用客户端逻辑进行分页(javascript)。这更容易且更具吸引力,但只能处理合理数量的数据。如果这不是一个选项,那么您应该将 xml 文件解析到数据库中并从那里传递分页数据。
  • arkascha 有一个观点,您可以在 javascript 中解析 XML 并使用 xpath 查询来选择获取页面所需的节点

标签: php symfony xmlreader symfony-http-foundation


【解决方案1】:

在 Symfony 中,您可以使用 StreamedResponse 以小块形式发送响应。它通常用于发送大文件,因为它不需要将整个文件加载到内存中,但它也应该满足您的需求。

在文档中查看它是如何使用的:http://symfony.com/doc/current/components/http_foundation.html#streaming-a-response

【讨论】:

  • 好的,但是如果我再次请求,我该如何继续阅读到原来的位置?
  • @Mahcih 例如,您可以将其存储在会话中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多