想渲染或生成一个目录下的所有php文件到静态html
Posted
技术标签:
【中文标题】想渲染或生成一个目录下的所有php文件到静态html【英文标题】:Want to render or generate all php files in a directory to static html 【发布时间】:2015-08-15 20:04:23 【问题描述】:我正在为本地企业开发一个小型网络项目。我为此使用了 php 包含和普通的 PHP 模板,因为我发现 CMS 对这项任务来说太大了。
我正在尝试使用 ob_start()、ob_get_contents() 将项目目录中的所有 .php
文件生成为静态 .html,例如:
ob_start();
$page = ob_get_contents();
ob_end_clean();
$out = "pages/page-1";
$file = $out.'/'. "filename.html";
@chmod($file,0755);
$fw = fopen($file, "w");
fputs($fw,$page, strlen($page));
fclose($fw);
这会生成当前页面(编写代码的地方),但我坚持为所有 .php
文件手动执行此操作,而不是将其添加到每个页面。
更新: 这是基本结构:
- index.php
- /about
--- about-us.php
--- our-story.php
- /products
--- interior/
--- some-product.php
--- exterior/
--- some-product.php
--- some-other-product.php
- /contact
--- contact.php
--- quote.php
- /includes (config,base.php,header.tpl,footer.tpl,...templates)
- /css/js/images/assets...
我会将脚本放在同一个文件夹中,它不应该呈现自己,html 输出将转到 /out 文件夹。
【问题讨论】:
研究使用glob
来遍历目录中的所有文件。
谢谢! glob 成功了。
【参考方案1】:
这是一个简单的脚本实现:
-
在目录中查找
.php
文件
运行每个.php
文件
将输出转储到具有相同名称的.html
文件中
这不是递归的,但我没有足够的关于您网站结构的信息来做出太多假设。
如果您更新您的问题,我可以更新我的答案 - 您可以使用 RecursiveDirectoryIterator
和恰当命名的 RecursiveRecursiveIterator
来递归遍历文件结构。
无论如何,这应该提供一个起点:
<?php
$iterator = new DirectoryIterator(__DIR__);
function isValidFile(SplFileInfo $fileInfo)
return $fileInfo->isFile()
&& 'php' === $fileInfo->getExtension()
&& basename(__FILE__) !== $fileInfo->getBasename();
function parseFile(SplFileInfo $fileInfo)
ob_start();
require_once $fileInfo->getBasename();
$data = ob_get_contents();
ob_end_clean();
return $data;
foreach ($iterator as $fileInfo)
if (isValidFile($fileInfo))
$data = parseFile($fileInfo);
$file = $fileInfo->getBasename('.php') . '.html';
file_put_contents($file, $data);
给定这样的文件结构:
你应该得到以下结果(假设 dir 是可写的):
希望这会有所帮助:)
【讨论】:
没问题!如果您想提供更多细节以帮助更好地回答您的问题,我很乐意更新答案:) 对不起,我是另一个人,这不是我的问题,我只是这个答案的旁观者,我喜欢这个解决方案,我的意思是我为这个解决方案感到高兴,我将保留它作为将来使用的参考,并为您的答案投票,但我今天已经使用了我所有的投票,必须等待几个小时。就是这样。 啊...哈哈对不起!我什至没有比较用户名!不用担心,干杯! @Darragh 感谢您的回答,这很有帮助。我试图投票,但这是不可能的。我更新了我的问题。我仍然对 .php 文件中的包含有问题。我想我应该创建一个base.php
并输入:define('WS_ROOT', dirname(__FILE__)); define('INC_ROOT', WS_ROOT . "/inc");
另外我怎样才能为 html 输出保持相同的结构?使用DirectoryIterator::isDir
早上好!我刚看到你的更新。我会看一下并更新我的答案以更准确地反映您的问题。我可能还有一个替代解决方案。关于解决路径,我们可能必须弄清楚这一点。您如何在 .php 文件中定义这些包含?顺便说一句,如果您使用的是 PHP >= 5.3,您可以使用 __DIR__
而不是 dirname(__FILE__)
;以上是关于想渲染或生成一个目录下的所有php文件到静态html的主要内容,如果未能解决你的问题,请参考以下文章
linux下的php网站放到Windows服务器IIS下导入 .htaccess文件伪静态规则转换 (wordpress)
如何设置网页默认index.htm而不是index.php?