用PHP编写的SSI解析器?

时间:2011-02-10 02:09:28

标签: php apache ssi

好吧,这可能听起来有点疯狂,但在这里忍受我一分钟。

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

我确信有些人可能会对美学产生争论,但对于静态HTML来说,它确实很有效。

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

我一直在使用我在PHP中编写的一个相当简单的SSI解析器(它处理#includes,以及一些非常简单的#if语句),但我想要一个更通用的解决方案。所以,在我开始编写一些可能有问题,更完整的SSI解析器之前,有没有人知道用PHP编写的完整SSI解析器?当然,我也对在我所概述的限制条件下工作的其他解决方案持开放态度。

非常感谢你的时间。

2 个答案:

答案 0 :(得分:2)

看看ESI:http://en.wikipedia.org/wiki/Edge_Side_Includes

你可以创建一个PHP代理来处理它们,它是Symfony2中的HttpCache:https://github.com/fabpot/symfony/blob/master/src/Symfony/Component/HttpKernel/HttpCache/Esi.php

或者使用像Varnish这样的HTTP代理,比Symfony2更具性能......

答案 1 :(得分: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>

那应该可以做到!希望能帮到那里的人。