T

PHP on Ruby (on PHP on Ruby on…)

同僚がphpDocumentorのソースに変なことが書いてあるというので見ると、確かに変だ。長いコメント部分を除くとこうなっている。

#!/bin/sh
if [ -z "$PHP" ]; then
   PHP=`which php`
fi
(exec $PHP -C -q -d output_buffering=1 "$0" "$@") 2>/dev/null
if [ "$?" -ne "0" ]; then
        echo "FAILED:  Bad environment variable \$PHP (set to \"$PHP\")"
        exit 1
fi
exit 0
<?php

ob_end_clean(); // make output from autofind php code disapear

$test = @include "phpDocumentor/find_phpdoc.php";
if ($test == 6) {
    // find_phpdoc.php returns 6
    include "phpDocumentor/phpdoc.inc";
} else {
    echo "Error: phpDocumentor not found" . PHP_EOL;
}
?>

シェルスクリプトが冒頭にきて、その中から今度はPHPとして実行されるように自分自身を呼び出して、しかもご丁寧に出力バッファリングでシェルのコード部分が出力されないようにしているよ!PHPはHTMLに埋め込まれる言語でもあるので、開始タグ「<?php」と終了タグ「?>」で囲まれていない部分はそのまま出力されるから、これでもちゃんと実行される。

それにしても、この手が使えるなら、シェルスクリプト以外の言語だって動かせるんじゃなかろうか。

さっそく実験。

#!/usr/bin/ruby

puts "This is Ruby!"
system("php -d output_buffering=1 -q #{__FILE__}")
exit
__END__
<?php
ob_end_clean();

print("This is PHP!\n");
exit;
?>

実行結果:

This is Ruby!
This is PHP!

なんと!

この手を使えば、PHP on Ruby on Railsだって夢じゃない!PHP4からの移行が大変?冗談でしょ。これからはPHPはあらゆるスクリプト言語の上(下)で動く時代ですよ。

Posted by on 4月 22, 2009 in Fun, PHP, Ruby

コメントを残す