拡張子が .php のファイルは、リクエスト時に PHP プロセッシングが行われるので問題無いのですが、例えば、MT 標準の検索機能を使った場合など、その出力結果に含まれる PHP コードは処理されません。そこでビルド処理の段階で PHP コードを処理したくてプラグインを書いてみたのですが、動作せずorz
何も考えずにビルド内容を PHP プロセッサにパイプするだけのプラグインだったのですが、CGI 権限で呼ばれた子プロセスである PHP のセキュリティ警告で動作しませんでした。
PHP が、force-cgi-redirectオプション付きでコンパイルされているためで、
シェルスクリプトからは期待した通りの動作になります。CGI として invoke された Perl からのパイプは、CGI の実行権限と同じになってしまうんですね…
勿体無いので(?)ソースコードを公開しておきます。「動作するようにしてやったぜ!」という神の降臨に激しく期待しています(笑
さくらインターネットのレンタルサーバで実験
#!/usr/bin/perl
package MT::Plugin::PHPProcess
use strict;
use File::Temp qw( tempfile );
use MT::Template::Context;
;# Register as a plugin
if (MT->can ('add_plugin')) {
require MT::Plugin;
my $plugin = MT::Plugin->new;
$plugin->name (__PACKAGE__);
MT->add_plugin ($plugin);
}
MT::Template::Context->add_container_tag (PHPProcess => &php_process);
;### MTPHPProcess
sub php_process {
my ($ctx, $args, $cond) = @_;
;#
;# build-up contents
my $builder = $ctx->stash ('builder');
my $tokens = $ctx->stash ('tokens');
my $out = $builder->build ($ctx, $tokens, $cond);
return $ctx->error ($builder->errstr)
unless defined $out;
;# save the whole content into a temporal file
my ($fh, $filename) = tempfile ();
if ($fh) {
print $fh $out;
close $fh;
;# Process with PHP
if (open PHP_PROCESS, "php -f $filename |") {
$out = join '', <PHP_PROCESS>;
close PHP_PROCESS;
}
}
return $out;
}
1;
寄せられたコメント (全 1 件中、最新 5 件まで表示しています)
redhat系では成功しません。
自debianではphpがcliまでインストールされているからかな〜
セキュリティーってphp.iniの
cgi.force_redirectの設定かな?
これをかいくぐっても次にまた関所があるんだが。
なんでdebinでいけたのだろう。