【问题标题】:Best way to save PHP output to a static file?将 PHP 输出保存到静态文件的最佳方法?
【发布时间】:2015-07-09 17:14:27
【问题描述】:

我有一个输出 XML 的 PHP 页面。但出于效率原因,最好提供一个 XML 页面。正确的?

XML 是播客 RSS 数据。 http://kansaspublicradio.org/widgets/podcasts/retro-cocktail-hour.php 还有一个就像它用于不同的节目一样。 PHP 代码从我们的 CMS (drupal) 收集数据并将其放入 iTunes 特定的 XML 标记中。我发现这是一个比任何可用的 drupal 模块更好的解决方案。

但是使用 PHP 文件提供 XML 有点不合常规。并且该 PHP 代码将在任何人或任何事物(即 iTunes 或 feedburner)发出对 RSS 数据的请求时执行。 PHP 代码只是查询数据库,然后循环遍历结果以编写 XML 标记,但每次仍然存在固有的内存和 sql 性能损失。

所以我需要提供一个静态 XML 文件。如何将 PHP 的输出保存到文件中??

我想我将创建另一个 PHP 脚本,例如 makepodcast.php,它运行原始 PHP 页面,但将其输出打印到 XML 页面。然后我可以做一个每周执行一次的 cron 作业(节目每周录制一次)。

但我迷失的是我究竟如何保存 PHP 的输出并将其写入另一个文件??

【问题讨论】:

  • 我不会认为 php 服务 XML “非常规”。 XML 与 HTML 非常相似(甚至 XHTML is XML),并且提供 HTML 并没有什么不合常规的地方。如果您的所有提要都是从数据库中提取并回显结果,那么这几乎是 PHP 所做的最基本的事情。
  • 你说得对,总的来说。我想我应该更清楚一点。不同寻常的是,当某人或某物单击 RSS 数据的链接时,他们将得到一个 PHP 页面而不是 XML 页面。他们会期待一个 XML 页面。这是特定于播客的。我想尽快将它提交给 iTunes,它可能会混淆这该死的东西。 iTunes 很挑剔....
  • 你在使用 XML 库吗?
  • 如果您发送一个 XML 标头并使用 mod_rewrite 将 feed.xml 重写为 feed.php,则无法判断该文件不是磁盘上的 xml 文件。我并不是说不应该缓存该文件。如果底层提要数据不经常更新,写入文件将是一件好事。只是说这对于 php 来说非常常见且易于处理,并且您可能会添加不必要的额外复杂性。

标签: php xml curl rss podcast


【解决方案1】:

您必须组织您的 XML 构建:每个周期、每个信号、每个事件? 完成后,您可以编写如下内容:

<?php
    header("Content-type: text/xml");

    define ('XML_FILE_PATH', 'CUSTOMIZE/YOUR/XML/FILE/PATH');

    if ($_MUST_BUILD_XML) {
        // put here your old PHP code that it will build your XML file 
        // i guess that it is something like $xml = '<xml>
        //                                              <videogame>
        //                                                  <ps4>The Best One :) </ps4>
        //                                              </videogame>'
        buildXmlFile('built_file.xml', $xml);
        print $xml;
    }
    else {
        print readXmlFile('built_file.xml'); 
    }

    /**
      * @return string : built XML data
      * @param string  : XML file path and name
      * @throws Exception
      */
    function buildXmlFile($data_s, $file_name_s) {
        $fp = fopen ("XML_FILE_PATH/" . $file_name_s , "w");
        if(!$fp) { 
            /*TODO Error*/ throw new Exception('...');
        }

        fputs($f, $data_s);
        fclose ($f);
    }

    /**
      * @param string  : XML file path and name
      * @return string : built XML data
      * @throws Exception
      */
    function readXmlFile($file_name_s) {
        $fp = fopen ("XML_FILE_PATH/" . $file_name_s , "r");
        if(!$fp) { 
            /*TODO Error*/ throw new Exception('...');
        }

        $contents = fread($fp, filesize("XML_FILE_PATH/" . $file_name_s);
        fclose ($f);
        return ($contents);
    }

希望有帮助:)

【讨论】:

  • 谢谢!我今天将尝试实现这一点。换到另一台服务器后出现效率问题,老服务器肯定有一些隐藏的php缓存什么的
【解决方案2】:

但是使用 PHP 文件提供 XML 有点不合常规。

这其实很传统。

PHP 代码将在任何人或任何东西(例如 iTunes 或 feedburner)请求 RSS 数据时执行。

考虑缓存输出 - PHP 的 APC 非常方便,或者您可以使用 file_get_contents / file_put_contents 制作您自己的非常简单的基于文件的缓存。

【讨论】:

  • 你说得对,总的来说。我想我应该更清楚一点。非常规的部分是,当某人或某物单击 RSS 数据的链接时,他们将得到一个 PHP 页面而不是 XML 页面。他们可能期待一个 XML 页面。这是特定于播客的。我想尽快把它提交给 iTunes,它可能会混淆这该死的东西。 iTunes 很挑剔...
  • @DanMantyla 您可以使用 PHP 提供 XML,您只需设置正确的 Content-Type 标头。 wordpress.org/news/feed 是一个例子——它都是由 PHP 即时生成的。
猜你喜欢
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多