对于我拥有的特定项目,不允许使用服务器端代码。如何在 php 中创建网站(带有包含、条件等),然后将其转换为可以提供给客户的静态 html 网站?
更新:感谢所有建议 wget 的人。这就是我用的。我应该指定我在 PC 上,所以我从这里获取了 Windows 版本:http: //gnuwin32.sourceforge.net/packages/wget.htm。
对于我拥有的特定项目,不允许使用服务器端代码。如何在 php 中创建网站(带有包含、条件等),然后将其转换为可以提供给客户的静态 html 网站?
更新:感谢所有建议 wget 的人。这就是我用的。我应该指定我在 PC 上,所以我从这里获取了 Windows 版本:http: //gnuwin32.sourceforge.net/packages/wget.htm。
如果您有可用的 Linux 系统,请使用wget:
wget -k -K -E -r -l 10 -p -N -F -nH http://website.com/
选项
构建您的站点,然后使用wget或lwp-mirror 之类的镜像工具获取静态副本
我过去通过添加:
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 来模拟某些功能,但这不能很容易地自动化。
正常创建站点,然后使用爬虫软件生成 HTML 副本。
HTTrack是我以前用过的软件。
一种方法是像往常一样在 PHP 中创建站点,并让脚本实际抓取网页(通过 HTTP - 您可以使用 wget 或编写另一个仅使用带有 URL 的 file() 的 php 脚本)并将它们保存到“完成”后的公共网站位置。然后,当您决定再次更改页面时,您可以再次运行脚本。当您有一个缓慢变化的数据库和大量流量时,此方法非常有用,因为您可以消除实时站点上的所有 SQL 查询。
如果你使用 modx 它有一个内置的函数来导出静态文件。
如果您有许多页面,包含各种请求变量等等,那么其他评论者提到的爬虫工具之一(wget、lwp-mirror 等)可能是最简单、最强大的解决方案。
但是,如果您需要获取的页面数量很少,或者至少是可管理的,那么您有一些不需要任何第三方工具的选项(并不是因为它们是第三方就应该打折它们)。
您可以在命令行上使用 php 将其直接输出到文件中。
php myFile.php > myFile.html
使用这种方法可能会很痛苦(尽管您可以将其全部放入 shell 脚本中),并且它不允许您以相同的方式传递变量(例如:php myFile.php?abc=1
不会工作)。
您可以使用另一个 PHP 文件作为“构建”脚本,其中包含您想要的所有 URL 的列表,然后通过file_get_contents()
or抓取它们并将它们file()
写入本地文件。使用这种方法,您还可以使用它来检查文件是否已更改(md5_file()
应该适用),因此您将知道应该给客户什么,如果他们只想要更新。
继 #2 之后,在将输出写入文件之前,扫描它以查找本地 url,然后将它们添加到要下载的文件列表中。当您在那里时,更改这些 url 以链接到您最终将命名您的输出的内容,以便您最终拥有一个正常运行的网络。请注意 - 如果这听起来不错,您可能可以使用已经存在的工具之一并为您执行此操作。
或者,您可以使用 (Win|Web)HTTrack ( Website ) 来获取静态页面。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。我强烈推荐 Savant 3,而不是 Smarty 等其他模板系统。
Savant 的重量很轻,使用 PHP 作为模板语言,而不是一些专有的子语言。您要查找的命令是 fetch(),它将“编译”您的模板并将其放置在您可以输出的变量中。