20

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

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

4

10 回答 10

44

如果您有可用的 Linux 系统,请使用wget

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

选项

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

资料来源:Jean-Pascal Houde 的博客

于 2008-09-15T20:34:31.433 回答
4

构建您的站点,然后使用wgetlwp-mirror 之类的镜像工具获取静态副本

于 2008-09-15T20:29:58.340 回答
3

我过去通过添加:

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 来模拟某些功能,但这不能很容易地自动化。

于 2008-09-15T20:39:22.407 回答
1

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

HTTrack是我以前用过的软件。

于 2008-09-15T20:29:55.313 回答
1

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

于 2008-09-15T20:31:25.390 回答
1

如果你使用 modx 它有一个内置的函数来导出静态文件。

于 2008-09-15T20:42:19.373 回答
1

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

但是,如果您需要获取的页面数量很少,或者至少是可管理的,那么您有一些不需要任何第三方工具的选项(并不是因为它们是第三方就应该打折它们)。

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

    php myFile.php > myFile.html

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

  2. 您可以使用另一个 PHP 文件作为“构建”脚本,其中包含您想要的所有 URL 的列表,然后通过file_get_contents()or抓取它们并将它们file()写入本地文件。使用这种方法,您还可以使用它来检查文件是否已更改(md5_file()应该适用),因此您将知道应该给客户什么,如果他们只想要更新。

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

于 2008-09-15T20:48:45.970 回答
1

或者,您可以使用 (Win|Web)HTTrack ( Website ) 来获取静态页面。HTTrack 甚至更正文件和文档的链接以匹配静态输出。

于 2008-09-15T22:52:04.647 回答
0

我在我自己的网站上为某些保证不会更改的页面执行此操作——我只是运行一个可以被煮沸的 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"
于 2008-09-15T20:32:28.867 回答
0

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

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

http://www.phpsavant.com/

于 2008-09-15T21:01:51.697 回答