PHP のコア開発者の Nikita さんが開発しており、Slim 3 に採用されている FastRoute を試してみました。ご本人の書いた解説記事によると、Pux という C 言語で書かれた PHP エクステンションよりも速いとのことです。
Composer
composer.json の内容は次のとおりです。0.4 系では PHP 5.4.0 が最小要件になっています。
{
"require": {
"nikic/fast-route": "0.4.*"
}
}
composer.json のあるディレクトリで次のコマンドを実行します。
composer install
.htaccess
Silex のサーバー設定マニュアルのコードを利用させてもらいます。
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
</IfModule>
コード
http://localhost/myapp/
に設置することを前提とします。
require 'vendor/autoload.php';
$base = '/myapp/';
$handlers = function(FastRoute\RouteCollector $r) use($base) {
$r->addRoute('GET', $base, 'index');
$r->addRoute('GET', $base.'about', 'about');
$r->addRoute('GET', $base.'user/{name}', 'user');
$r->addRoute('POST', $base.'api/charge', 'charge');
};
// $dispatcher = FastRoute\simpleDispatcher($handlers);
$dispatcher = FastRoute\cachedDispatcher($handlers, [
'cacheFile' => __DIR__ . '/route.cache',
'cacheDisabled' => true
]);
$uri = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];
$routeInfo = $dispatcher->dispatch($method, $uri);
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::NOT_FOUND:
echo "ページが見つかりませんでした。\n";
break;
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$allowedMethods = $routeInfo[1];
echo "許可されない HTTP リクエストです。\n";
break;
case FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
echo $handler($vars);
break;
}
function index($vars)
{
return "トップページです。\n";
}
function about($vars)
{
return "このサイトに関するページです。\n";
}
function user($vars)
{
return "{$vars['name']} さん、こんにちは。\n";
}
function charge($vars)
{
if (!isset($_POST['amount'])) {
return "金額が入力されていません。\n";
}
if (500 > $_POST['amount']) {
return "寄付金は500円以上からお願いします。\n";
}
return "寄付していただきありがとうございました。\n";
}
ページの表示の確認
curl で HTTP リクエストを送信してみましょう。まずは GET リクエスト対応のトップページからです。
curl http://localhost/myapp/
次は POST リクエストのページです。
curl http://localhost/myapp/api/charge -F amount=500