]> PHPでSSIのinclude virtual的なことをする (+virtual関数のバグについて) | FullAstern!

Notes

メモ書き

PHPでSSIのinclude virtual的なことをする (+virtual関数のバグについて)

アクセスカウンタなどのCGIの出力をHTMLの一部に埋め込むのに便利なSSIですが、 標準的なサーバでは拡張子が.shtmlのページでしか動作できません。 以下は.phpでSSIの動作を再現する方法です。

PHPのfile_get_contents()関数がURLに対しても使えるので、これを利用して

本日の訪問者: <?php echo file_get_contents("http://localhost/hoge/counter.cgi?c=today"); ?>&lf;

と書くことでSSIと同様の機能を果たすことができます。 必ずPHPのallow_url_fopenをOnにしておきましょう。 #もっとエレガントな方法あったら教えて下さい

2014/06/03追記: virtual() 関数について

PHPは<#include virtual…>と同じ役割を持つ関数として virtual()を備えているとのことです。 mod_php (モジュールモード)限定という制約はあるものの、SSIの代用としては十分そう。 「なんだちゃんと専用の関数があるやんけー流石はPHP」。

……と思ったらこのvirtual()、 どうも mod_deflate を運用している環境だと まともに動いてくれないようです。

試しに<?php virtual('test.cgi'); ?> と適当なCGI出力を読み込ませる構文を書き込んでChromiumから開いてみたところ、 Deflate無効の状態では正常に読み込まれるも、Deflateを有効にした途端 ERR_CONTENT_DECODING_FAILED と怒られてしまいました。

便利な関数なので早期の修正に期待したいですね……

© FullAstern!