如何在php中创建网站并生成静态版本?

时间:2020-03-05 18:54:26  来源:igfitidea点击:

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

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

解决方案

回答

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

HTTrack是我以前使用过的软件。

回答

构建网站,然后使用wget或者lwp-mirror之类的镜像工具获取静态副本

回答

一种方法是正常使用PHP创建网站,并让脚本实际抓取网页(通过HTTP,我们可以使用wget或者编写另一个仅使用带有URL的file()的php脚本)并将其保存给公众"完成"时的网站位置。然后,当我们决定再次更改页面时,可以再次运行脚本。当数据库变化缓慢且通信量很大时,此方法非常有用,因为我们可以消除实时站点上的所有SQL查询。

回答

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

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

静态化为:

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

回答

如果我们有可用的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:递归当然我们要创建一个递归副本
  • -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);

我们可能需要先将.php扩展名转换为.html,然后再将HTML烘焙到文件中。
如果我们需要使用变量生成多个页面,一个很简单的选择是在文件名后添加所有GET变量的md5sum,我们也只需在HTML中进行更改。因此,我们可以转换:

somepage.php?var1=hello&var2=hullo

somepage_e7537aacdbba8ad3ff309b3de1da69e1.html

丑陋但可行。

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

回答

如果我们使用modx,则它具有内置功能来导出静态文件。

回答

如果我们有许多页面,并带有各种请求变量和诸如此类的内容,那么其他评论者提到的一种爬虫工具(wget,lwp-mirror等)可能是最简单,最可靠的解决方案。

但是,如果我们需要获取的页面数量很少或者至少可管理,那么我们将获得一些不需要任何第三方工具的选择(不是因为它们是第三方,所以我们不应该对它们进行打折)。

  • 我们可以在命令行上使用php,以使其直接输出到文件中。 php myFile.php> myFile.html使用此方法可能会很痛苦(尽管我们可以将其全部放入shell脚本中),并且它不允许我们以相同的方式传递变量(例如:php myFile。 php?abc = 1`无效)。
  • 我们可以使用另一个PHP文件作为"构建"脚本,其中包含所需的所有URL的列表,然后通过file_get_contents()或者file()获取它们并将它们写入本地文件。使用此方法,我们还可以获取它来检查文件是否已更改(`md5_file()应该适用于此更改),因此,如果客户端仅希望更新,我们将知道该如何给客户端。
  • 在#2之后,在将输出写入文件之前,请先对其进行扫描以查找本地URL,然后将其添加到要下载的文件列表中。当我们在那里时,更改这些URL以链接到最终将为输出命名的内容,以便最终使网络正常运行。此处请注意-如果听起来不错,则可以使用现有的一种工具来为我们完成此操作。

回答

wget可能是最完整的方法。如果我们无权访问,并且我们具有基于模板的布局,则可能需要研究使用Savant3. 与其他模板系统(如Smarty)相比,我强烈建议我们使用Savant 3.

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

http://www.phpsavant.com/

回答

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