SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】eval() が意外と遅くない。むしろ速い。

私は今まで eval() は、反則技、変則的処理のようなイメージを持ってました。
インタプリタ言語ならではな感じですし、ものすごく遅いのでは?と思ってました。
ところが、イメージに反して phpの eval()が遅くない。むしろ速い。

実験

次のような感じで、クラスをc1~c10000まで、c1.php~c10000.phpのファイルで定義します。
c1.php → class c1 {var $test;}
c2.php → class c2 {var $test;}
c3.php → class c3 {var $test;}
……

ファイルが10000個、クラスが10000個。
include用には <?php をつけて、 eval()用には、開始タグ、終了タグはつけません。

・includeの場合

for ($i = 1; $i <= 10000; ++$i) {
    include 'c' . $i . '.php';
}

・eval()の場合

for ($i = 1; $i <= 10000; ++$i) {
    eval(file_get_contents('c' . $i . '.php'));
}

・実行時間
include → 3.5秒ぐらい
eval() → 2.8秒ぐらい

includeのときは開始コード”<?php “の分だけ6バイトファイルが大きいことに今さら気づきましたが、それでもeval()は全然遅くないことが分かります。
うーん。思い込みで判断してはいけなかったです。

これなら、ソースコードをファイルで持つ必要もないのでは?なんてアイデアも浮かびます。
ソースはすべてデータベースに格納して、すべて eval() で実行するなんてフレームワークもありですね。
SQLでソースが更新できます。

全部データベースに入れるのは行き過ぎとしても、画面表示用のテンプレートをデータベースに格納すれば、CMSなどでは管理画面から触りやすくなります。
しかもeval()でレンダリングするからphpが実行できる。
おもしろいなぁ。

すでに drupal の php filter などで実装されてそうですが、これで私も抵抗なく使えます。

関連するメモ

コメント