永久性地将动态PHP / MySQL论坛缓存为静态页面

时间:2009-03-30 01:30:56

标签: php mysql database forum archiving

我曾经为一小群在线死亡竞赛玩家运行了一个自制的论坛系统。这些论坛早已关闭,目前处于脱机状态。我想要做的是创建包含整个系统的所有数据的静态HTML文件,以便拥有以前用户可以搜索的在线存档。

我可以控制所有原始数据。这将包括:

  • 图片
  • 配置文件
  • 论坛主题
  • 数据库
  • PHP脚本

基本上,我想把数据库排除在等式之外,这样我就不必浪费资源来保持它的存活。 (还因为这是一个自制的论坛解决方案,我确信它不是很优化)

这是一个可行的目标,还是我应该保持论坛的方式,而不是担心开销?

如果可能(并且远程可行),我可以获得一些关于如何进行的建议吗?

3 个答案:

答案 0 :(得分:4)

wget可以创建网站的HTML镜像。查看文档以了解--mirror。

的用法

答案 1 :(得分:1)

使用输出缓冲捕获所有输出并将其写入文件而不是浏览器。

编辑你的代码,使其在顶部(在任何HTML输出到浏览器之前),你有这一行:

ob_start();

在脚本的末尾添加:

$output = ob_get_clean();
file_put_contents("<<name of this page>>.html", $output);

你必须提出一些命名方案,这样你就不会重复了。

然后,使用正则表达式,使用apache RewriteRules将所有请求重定向到新的HTML页面,这样您的链接就不会中断。

要获取所有页面,只要你没有很多页面,你可以逐个点击它们,你可以手动将所有的URL写入一个数组,然后循环遍历它们,或者你甚至可以抓取它们自己站点,查找页面上的所有URL并在出发时将它们添加到队列中。

答案 2 :(得分:0)

ceejayoz所说的或者,你可以在你的应用程序的引导程序中添加一个缓存标题,这是你认为你需要多年的缓存。

您调用附加函数,并希望客户端缓存页面,请确保在session_start之后调用此函数,因为session_start会发出阻止缓存的标头。

function client_side_cache($hours)

{
        //in the event a session start is used, I have to clean all the #$%# headers it sends to prevent caching
        header('Cache-Control: ',true);
        header("Pragma: ", true);
        header("Expires: ", true);

        //get the If-Modified-Since header in a unix time format
        $headers = getallheaders();
        if (isset($headers['If-Modified-Since']))
        {
            $modifiedSince = explode(';', $headers['If-Modified-Since']);
            $modifiedSince = strtotime($modifiedSince[0]);
        }
        else
        {
            $modifiedSince = 0;
        }

        //calculate the Last-Modified timestamp
        $current_time=time();
        $last_modified=($current_time)/($hours*3600);
        $last_modified=(int)$last_modified;
        $last_modified=$last_modified*$hours*3600;

    //check cache not expires
        if ($last_modified <= $modifiedSince)
        {
            header('HTTP/1.1 304 Not Modified');
            exit();
        }

        else //emit a new Last-Modified (either cache expired or page wasn'r cached
        {
            Header('Last-Modified: '.gmdate("D, d M Y H:i:s",$last_modified).' GMT ');
        }

}