2011-02-10 5 views
6

OK、これはちょっと狂っているかもしれませんが、ここで私には1分間は負担してください。SSIパーサーはPHPで書かれていますか?

標準でSSIを使用してページヘッダー、フッター、およびメニューを含めるサイトで作業しています。インクルードされたファイルはSSI条件を使用してさまざまなブラウザを処理し、いくつかの#includeネスト、および#set/#ifトリッキーを使用してメニュー内の現在のページを強調表示します。言い換えれば、SSIの#includeディレクティブだけではありません。

私は美学を主張する人もいるかもしれませんが、実際には静的なHTMLに対してはうまく機能します。

問題:私はPHPスクリプトからSSIで解析された同じヘッダーとフッターのHTMLファイルを「#include」したいので、コードの重複を避けて、サイトの一貫した外観を維持してください。 PHPが通常のmod_php環境で実行されていた場合、PHPのvirtual()関数を使用してPHPを実行できます。残念ながら、サイトではFastCGI/suexecを使用してPHPを実行しています(VirtualHostを別のユーザーとして実行できるようになります)。これによりvirtual()が破損します。

私はPHPで書いたかなり単純なSSIパーサを使用しています(#includesと実際には単純な#if文を処理しますが)、もっと一般的な解決策が必要です。 SSIパーサーを書くと、SSIパーサーがPHPで書かれていることが分かりますか?当然ながら、私は、私が概説した制約の下で動作する他のソリューションにもオープンしています。

ありがとうございました。

+1

私はSSIインクルードファイルを "#include"ネストし、 '#set' /'#if'トリッキー "* static * HTMLと呼ぶことはしません。 ;)そうでなければ、面白い質問。 :D – deceze

+0

私が知っている唯一の実装はhttp://nanoweb.si.kz/manual/mod_include.htmlですが、これは3つの標準関数を実装しており、パーサーの多くを構成するものでもありません。 – mario

+0

@deceze:ユーザーが要求したHTMLファイルのたびに同じ出力が生成されるという意味では静的です。私は、SSIを含むファイルは静的ではないことに同意します。 –

答えて

2

は、ESIを見てみましょう:あなたはPHPプロキシそれらを処理するために作成することができますhttp://en.wikipedia.org/wiki/Edge_Side_Includes

、それはSymfony2の中HttpCacheです:https://github.com/fabpot/symfony/blob/master/src/Symfony/Component/HttpKernel/HttpCache/Esi.php

またはSymfony2のよりパフォーマンスの高いニスのようなHTTPプロキシを使用します。 ..

+0

興味深いアイデア。残念ながら、私はサーバーを完全に制御することはできないので、ワニスのようなフルプロキシをインストールすることはできません。 symfonyは便利に見えますが、私は間違いなく他の目的のためにそれを調べますが、私はかなり小さなソリューションを望んでいます。 Symfonyは、ベースインストールで20メガバイトを超えるように見えます。私はモジュール式に読み込むのがどれくらい良いのか分かりませんが、この比較的簡単な問題のために重大な過度の攻撃のように見えます。 –

1

私はこれが古い質問であることを認識していますが、数年前にも同じ問題が発生しました。私は先に進み、以前の試みをフォークし、完全なApache(2.2.22)mod_includeエミュレータ/パーサーをperlモジュールとして実装しましたhttp://search.cpan.org/dist/CGI-apacheSSI/lib/CGI/apacheSSI.pmまもなく、私はApacheのoutput filtersを見つけ、自分のニーズに合った完璧なソリューションを実現しました。基本的には、あなたのスクリプトの出力を.shtmlまたは.php(または何でも)のように解析するようApacheに指示できます。だから、あなたはSSIマークアップをperlやphp(あるいは何でも)のスクリプトから出力して、それを解析することができます。

通常のCGIファイルのためだが、用心
AddOutputFilter INCLUDES .cgi 

は、これが実行されているすべての.cgiのファイルにオーバーヘッドのかなりのビットを付加するので、どのようなI実際に:これは、あなたが(あなたの.htaccessファイルで)それを行うことができる方法でありますそれは、その出力が解析されたCGIとして実行されるようにオーバーヘッドが通常のCGIファイルに追加しなくても、特別な拡張機能を作成されます:

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

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

をあなただけのような何かを行うことができます

それはトリックを行う必要があります!誰かを助けることを願っています。

関連する問題