想渲染或生成一个目录下的所有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的主要内容,如果未能解决你的问题,请参考以下文章

PHP在Apache/Nginx/IIS环境下的伪静态配置

linux下的php网站放到Windows服务器IIS下导入 .htaccess文件伪静态规则转换 (wordpress)

如何设置网页默认index.htm而不是index.php?

请教Nginx访问控制配置,想禁止请求web目录下的 .svn目录及其所有子目录和文件

如何把zblog所有文章放在根目录下,静态生成html文件

php如何把创建的文件自动存到指定的目录?