用PHP编写的SSI解析器?
好的,这可能听起来有点疯狂,但在这里忍受一分钟。用PHP编写的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解析器?当然,我也对其他解决方案开放,这些解决方案在我所概述的限制条件下工作。
非常感谢您的时间。
在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的更高性能。 ..
我意识到这是一个古老的问题,但几年前我遇到了同样的问题,虽然使用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>
,这应该做的伎俩!希望能帮助那里的人。
我不会用“`#include`嵌套和`#set` /`#if` trickery”* static * HTML来调用SSI包含的文件。 ;)否则,有趣的问题。 :D – deceze 2011-02-10 02:19:17
我知道的唯一实现是http://nanoweb.si.kz/manual/mod_include.html - 但它只是实现了三个标准函数,并不构成很多解析器。 – mario 2011-02-10 02:34:01