对于我的特定项目,不允许使用服务器端代码。如何在 php 中创建网站(包含包含、条件等),然后将其转换为可以提供给客户的静态 html 网站?

更新:感谢所有建议 wget 的人。这就是我用的。我应该指定我是在 PC 上,所以我从这里获取了 Windows 版本: http://gnuwin32.sourceforge.net/packages/wget.htm.

有帮助吗?

解决方案

如果您有可用的 Linux 系统 获取:

wget -k -K  -E -r -l 10 -p -N -F -nH http://website.com/

选项

  • -k:将链接转换为相对链接
  • -K:保留文件的原始版本,无需 wget 进行转换
  • -E:将 html 文件重命名为 .html(如果它们还没有 htm(l) 扩展名)
  • -r:递归......当然我们想要制作一个递归副本
  • -l 10 :最大递归级别。如果您有一个非常大的网站,您可能需要设置更高的数字,但 10 个级别就足够了。
  • -p:下载每个页面的所有必需文件(css、js、图像)
  • -N:打开时间戳。
  • -F :从文件读取输入时,强制将其视为 HTML 文件。
  • -nH:默认情况下,wget 将文件放在以站点主机名命名的目录中。这将禁止创建这些主机名目录并将所有内容放入当前目录中。

来源: Jean-Pascal Houde 的博客

其他提示

我过去通过添加以下内容来做到这一点:

ob_start();

在页面顶部,然后在页脚:

$page_html = ob_get_contents();
ob_end_clean();
file_put_contents($path_where_to_save_files . $_SERVER['PHP_SELF'], $page_html);

在将 HTML 烘焙到文件中之前,您可能需要将 .php 扩展名转换为 .html。如果您需要生成带有变量的多个页面,一个非常简单的选择是在文件名后附加所有 GET 变量的 md5sum,您只需要在 HTML 中更改它们即可。所以你可以转换:

somepage.php?var1=hello&var2=hullo

somepage_e7537aacdbba8ad3ff309b3de1da69e1.html

丑陋但有效。

有时您可以使用 PHP 生成 javascript 来模拟某些功能,但这不能很容易地自动化。

构建您的网站,然后使用镜像工具,例如 获取 或者 lwp镜像 获取静态副本

正常创建网站,然后使用爬虫软件生成 HTML 副本。

HTTrack 是我以前用过的软件。

一种方法是像平常一样在 PHP 中创建站点,并让脚本实际抓取网页(通过 HTTP - 您可以使用 wget 或编写另一个仅使用带有 URL 的 file() 的 php 脚本)并将它们保存到当您“完成”时,公共网站位置。然后,当您决定再次更改页面时,只需再次运行脚本即可。当您的数据库变化缓慢且流量很大时,此方法非常有用,因为您可以消除实时站点上的所有 SQL 查询。

如果您使用 modx,它具有导出静态文件的内置功能。

如果您有许多页面,包含各种请求变量等,那么其他评论者提到的蜘蛛工具之一(wget、lwp-mirror 等)可能是最简单、最强大的解决方案。

但是,如果您需要获取的页数很少,或者至少 易于管理的, ,您有一些不需要任何第三方工具的选项(并不是说您应该仅仅因为它们是第三方而对它们打折)。

  1. 您可以在命令行上使用 php 使其直接输出到文件中。

    php myFile.php > myFile.html

    使用此方法可能会很痛苦(尽管您可以将其全部放入 shell 脚本中),并且它不允许您以相同的方式传递变量(例如: php myFile.php?abc=1 不会工作)。

  2. 您可以使用另一个 PHP 文件作为“构建”脚本,其中包含您想要的所有 URL 的列表,然后通过 file_get_contents() 或者 file() 并将它们写入本地文件。使用此方法,您还可以让它检查文件是否已更改(md5_file() 应该可以做到这一点),这样您就会知道应该向客户提供什么,如果他们只需要更新。

  3. 进一步到 #2,在将输出写入文件之前,扫描本地 URL,然后将其添加到要下载的文件列表中。当您在那里时,更改这些网址以链接到您最终命名输出的内容,以便最终拥有一个正常运行的网络。这里请注意 - 如果这听起来不错,您可能可以使用现有的工具之一来为您执行此操作。

除了 wget 之外,您还可以使用 (Win|Web)HTTrack (网站)来抓取静态页面。HTTrack 甚至可以更正文件和文档的链接以匹配静态输出。

我在自己的网站上对某些保证不会更改的页面执行此操作 - 我只需运行一个可以煮沸的 shell 脚本(警告:bash 伪代码):

find site_folder -name \*.static.php -print -exec Staticize {} \;

静态化为:

# This replaces .static.php with .html
TARGET_NAME="`dirname "$1"`/"`basename "$1" .static.php`".html
php "$1" > "$TARGET_NAME"

wget 可能是最完整的方法。如果您无权访问它,并且您有基于模板的布局,您可能需要考虑使用 Savant 3。与 Smarty 等其他模板系统相比,我强烈推荐 Savant 3。

Savant 非常轻量,使用 PHP 作为模板语言,而不是某些专有的子语言。您想要查找的命令是 fetch(),它将“编译”您的模板并将其放置在您可以输出的变量中。

http://www.phpsavant.com/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top