拡張子が .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でいけたのだろう。