OrePHPはこれでさらに高速になった(OrePhalcon)

前回、OrePHPはシンプルで速いクールなフレームワーク - ぷぎがぽぎという内容の記事を書きましたが、これぐらいの速度で満足してはいけないということで更に高速化を考えました。

Cのエクステンションで書かれた超高速PHPフレームワーク Phalcon

Phalconというフレームワークをご存知でしょうか?フレームワークをCのエクステンションで書いちゃった超高速PHPフレームワークです。
最速フレームワークと宣言してあるだけのことがあるベンチマーク結果が以下のグラフです。


前回のベンチマークをも超越しそうな結果です。というわけで、早速HelloWorldでOrePHPと比べてみます。
まずはPhalconをインストール。
エクステンションなのでgitからcloneしてきたものをいつもどおりphpnizeしてmake。

あとはphp.iniに

extension=phalcon.so

を追加。

環境はPHP5.4 + nginx なので
nginxの設定に以下を追加

        location / {
          if (!-e $request_filename) {
            rewrite ^/(.+)$ /index.php?_url=$1 last;
            break;
          }
        }

_urlというパラメータで渡すのを忘れずに。

準備はできたのでさっそくベンチ。

name trans/sec relative(%)
OrePHP 484.76 100%
Phalcon 738.94 152%

はい。簡単に負けましたw
最速と自負するだけのことはあります。

じゃあ、Phalconをベースにすればいいじゃまいか

OrePHPではSymfony ComponentsのRoutingコンポーネントを使っていましたが、たぶんこれがCで書かれていないから負けるんだということで、Phalconのルーティングを使うようにしてOrePhalconを作ってみました。

<?php
ini_set('display_errors', 1);
error_reporting(-1);

$router = new Phalcon_Router_Regex();
$router->setBaseUri('/phalcon');
$router->add("hello/(\w+)", array(
    "controller" => "hello",
    "action" => "say",
    "name" => 1,
));

$router->handle();
$controller = $router->getControllerName();
$action =  $router->getActionName();
$params = $router->getParams();

try{
  $controllerFilePath = __DIR__ . '/../app/controllers/' . $controller . ".php";
  if (!file_exists($controllerFilePath)) {
    throw new Exception("controller file is not found");
  }
  require $controllerFilePath;
} catch (Exception $e) {
  echo $e->getMessage();
  exit;
}

$class = ucfirst($controller);
echo $class::$action($params);

今回は最速を目指すのでフレームワークとしてコアファイルはこのファイル1つです。
フレームワークのコアクラスはエクステンションで書かれているのでrequireすら不要です。

あとは、実際に呼び出されるコントローラーファイルをHello.phpとして用意します。

<?php
class Hello
{
  public static function say($params)
  {
    return "Hello " . $params['name'];
  }
}

OrePhalconは最速になれたのか?

name trans/sec relative(%)
OrePHP 484.76 100%
Phalcon 738.94 152%
OrePhalcon 923.60 191%

はい。最速でした。
Phalconほんと速いですね。