用PHP编写的SSI解析器?

6

好的,这可能听起来有点疯狂,但请耐心听我说一分钟。

我正在开发一个网站,在该网站中使用SSI包含页面头部、底部和菜单是标准做法。包含文件使用SSI条件处理不同的浏览器,一些#include嵌套以及一些#set / #if技巧来突出显示菜单中的当前页面。换句话说,SSI中不仅仅是#include指令。

我相信有些人会对美学提出异议,但对于静态HTML,它实际上工作得非常好。

现在,问题来了:我想从我的PHP脚本中“#include”相同的SSI解析的头部和底部html文件,从而避免代码重复并仍然保持网站的统一外观。如果PHP在通常的mod_php环境中运行,我将能够通过使用PHP的virtual()函数来实现。不幸的是,该网站使用FastCGI/suexec来运行PHP(以便每个虚拟主机可以作为不同的用户运行),这会破坏virtual()。

我一直在使用我编写的一个相当简单的PHP SSI解析器(它处理#include和一些非常简单的#if语句),但我想要更通用的解决方案。因此,在我疯狂编写一些可能有缺陷的更完整的SSI解析器之前,是否有人知道用PHP编写的完整的SSI解析器?当然,我也愿意接受其他在我概述的限制下工作的解决方案。

非常感谢您的时间。


1
我不会把使用“#include”嵌套和“#set” / “#if”技巧的SSI包含文件称为静态HTML。 ;) 不过,这是一个有趣的问题。 :D - deceze
我所知道的唯一实现是http://nanoweb.si.kz/manual/mod_include.html - 但它只实现了三个标准函数,且并不构成一个完整的解析器。 - mario
@deceze: 嗯…他们是“静态的”,每个用户请求的HTML文件每次都会产生相同的输出。不过,我同意SSI包含的文件根本不是静态的。 - Rick Koshi
@mario:我同意,那个模块对于我正在做的事情来说绝对没有足够的功能。 - Rick Koshi
2个回答

2

有趣的想法。不幸的是,我无法完全控制服务器,因此无法像安装完整代理(如Varnish)一样进行安装。Symfony看起来很有用,我肯定会进一步调查它的其他用途,但我真的希望有一个更小的解决方案。Symfony基本安装似乎超过20兆字节。我不知道它的模块化加载情况如何,但对于这个相对简单的问题,它绝对看起来过度臃肿了。 - Rick Koshi

1
我知道这是一个旧问题,但几年前我遇到了同样的问题,不过使用的是perl实现。我继承了之前的尝试,并且已经实现了完整的apache(2.2.22)mod_include模拟器/解析器作为perl模块http://search.cpan.org/dist/CGI-apacheSSI/lib/CGI/apacheSSI.pm。很快我发现了apache output filters,并意识到这对我的需求来说是多么完美的解决方案。基本上,你可以告诉apache将脚本的输出解析为.shtml或.php(或其他)文件。因此,您可以从perl或php(或其他)脚本输出SSI标记,并让apache解析它。这是如何做到的(在您的.htaccess文件中):
AddOutputFilter INCLUDES .cgi

这是针对普通的cgi文件,但要注意,这会给所有执行的.cgi文件增加相当大的开销,所以我实际上会创建一个特殊的扩展名,以便它作为cgi运行,然后解析其输出,而不会给普通的cgi文件添加额外的开销:

<Files ~ ".pcgi$">
    Options +SymLinksIfOwnerMatch +Includes
    AddOutputFilter INCLUDES .pcgi
</Files>

对于PHP,你可以像这样做:

<Files ~ ".pphp$">
    Options +SymLinksIfOwnerMatch +Includes
    AddOutputFilter INCLUDES .pphp
</Files>

那应该就可以了!希望能对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接