PHPでウェブアプリケーションを開発する場合、フルスクラッチで書くことはほとんどなくなり、なんらかのフレームワークを使うことが一般的になってきました。
API開発ももちろんそうで、色んなフレームワークでAPI開発を加速させる機能が実装されています。
今回ご紹介するフレームワークは、開発もそうですが、作成したアプリケーションの実行速度が爆速になる魔法のようなフレームワーク、Phalconをご紹介します。
目次
実行速度が爆速になる、Phalconフレームワーク
Phalconは、PHPで実行されるプログラムの中では桁違いの速度をもたらすフレームワークとして知られています。
通常PHPフレームワークは、ルーティングやO/Rマッパーなどフレームワークの機能を提供する部分のプログラムもPHPで書かれていること場合がほとんどですが、Phalconはフレームワーク部分がZephirというPHPの拡張機能の開発で用いられるプログラム言語を使って書かれており、コンパイルで最適化された後、PHPモジュールとしてPHPの起動時に読み込まれるという通常のフレームワークとは異なるアプローチを経て実行される部分に大きな違いがあります。
この影響かどうかはわからないですが、ディレクトリ構造がとても自由にレイアウトできるのもPhalconの特徴です。
他のフレームワークのように、フレームワークのコアにあたるファイル群は一切ないので構造的な変化にとても強いですが、あまりトリッキーな構造にしてしまうと分かりづらくなるのは確実なので、一般的なPHPフレームワークにありがちな構造を保つ方がチーム開発は捗るでしょう。
また、出来上がってからの処理速度は速いPhalconですが、開発速度に関しては他のフレームワークより時間が掛かってしまうことがどうも多いようです。
日本語の情報がまだまだ少ないというのと、フレームワークのソースコードがZephirで書かれているので、慣れるまで読み解くのに時間が掛かるのではないでしょうか。
Phalconフレームワークでの開発を支えるツール
Laravelにartisanが、CakePHPにbakeがあるように、Phalconにも、phalcon-devtoolsというコマンドラインツールが存在します。
このphalcon-devtoolsは、適切にパスを通せばphalconコマンドを通じて開発に必要な機能を提供してくれます。
phalcon-devtoolsには、以下のコマンドがあります。
コマンド名 | 使い方の一例 | 説明 |
---|---|---|
info | phalcon info | Phalconの実行環境の情報を表示 |
commands | phalcon commands | phalconサブコマンドの一覧表示 |
controller | phalcon controller ––name users | コントローラーファイルの作成 |
module | phalcon module ––name admin | phalconプロジェクトの下に指定した名前のモジュールを作成 |
model | phalcon model ––name users ––extends base | モデルファイルの作成 |
all-models | phalcon all-models | DBのテーブル情報からモデルファイルを起こす |
project | phalcon project my-project simple | phalconの開発に必要な諸々を用意する |
scaffold | phalcon scaffold ––table-name blogs | 一般的なCRUD処理に必要なコントローラー、モデル、ビューファイルを一括作成 |
migration | phalcon migration | DBのマイグレーションを実行 |
webtools | phalcon webtools enable | phalconコマンドをGUIで操作できるwebツールを有効化、または無効化 |
serve | phalcon serve | PHPのビルトインサーバーでwebアプリケーションを実行 |
console | phalcon console | PHPのREPL環境を起動(psyshを使うようです) |
全てのphalconサブコマンドに「––help」オプションが設定されており、コマンドが持つオプションを確認することができます。
便利なオプションはまだまだありますので一度確認されることをおすすめします。
また、他のフレームワークのようにPHPファイルが存在しないことによるデメリットとして、素の状態ではIDEのコード補完が効きません。
この問題に対しては、phalcon-devtoolsに同梱されているスタブで解決でき、PhpStormやEclipseなどのIDEに読ませることで、コード補完が効くようになります。
CentOS7環境にphalconの動作環境を整える
phalconフレームワークを実行するために必要な作業は以下の通りです。
- yumでnginx、php、phalconのインストール
- nginxとphp-fpmの調整をして動作確認
- phalcon-devtoolsのインストール
yumにremiリポジトリを追加
yumでremiリポジトリを使うためには、EPELを先に追加しておく必要があります。
sudo yum install epel-release
yumで必要なパッケージをインストール
PHP7.1系で必要なパッケージとnginxのインストールを行います。
DBが必要な場合は、MySQL、PostgreSQL、SQLiteなどメジャーなDBは対応していますので、お好みのものを使ってください。
今回は、MySQLを別途インストールして使っています。
sudo yum install --enablerepo=remi-php71 php php-mbstring php-mcrypt php-mysqlnd php-pdo php-fpm nginx
phalconのインストール
remiリポジトリには、PHPのバージョンに合わせたphalconパッケージも用意されていますので、以下のコマンドで簡単にインストールできます。
yum install --enablerepo=remi-php71 php-phalcon3
php-fpmとnginxの調整をして動作確認
最後にphp-fpmとnginxの設定を調整します。
php-fpmとnginxを連携させる方法として、TCP/IPを利用した方法とUNIXドメインソケットを利用した方法の2種類があります。
TCP/IPは特に設定の必要はなくお手軽ですが、速度面ではUNIXドメインソケットを利用したほうが有利です。
せっかくPhalconを使っているんだから、できる限り速く動作するように、UNIXドメインソケットを使うようにしてみます。
設定を変更するファイルは以下の2つです。
- /etc/php-fpm.d/www.conf
- /etc/nginx/nginx.conf
php-fpm側の設定
/etc/php-fpm.d/www.confでは、php-fpmのプロセスがnginxユーザーで実行されること、UNIXドメインソケットを利用すること、最後にUNIXドメインソケットがnginxユーザーで作成されることの3つを設定します。
■php-fpmのプロセスがnginxユーザーで実行されるようにする
デフォルトではapacheユーザーで実行されるようになっているので、nginxユーザー、nginxグループで実行されるように修正します。
; user = apache # コメントアウト user = nginx # 追記 ; group = apache # コメントアウト group = nginx # 追記
■UNIXドメインソケットで通信するようにする
デフォルトではローカルホストの9000番ポートで通信を受け付けているのでソケットファイルのパスに書き換えます。
; listen = 127.0.0.1:9000 # コメントアウト listen = /run/php-fpm/php-fpm.sock # 追記
■UNIXドメインソケットがnginxユーザーで作成されるようにする
デフォルトでは、起動したユーザー(systemctl経由で実行する場合は大抵rootユーザー)でソケットファイルが作成されるので、nginxからアクセスできない状態になります。
そこで、ソケットファイルのオーナー情報をnginxの実行ユーザーに合わせることでアクセスできるようにしています。
;listen.owner = nobody listen.owner = nginx # 追記 ;listen.group = nobody listen.group = nginx # 追記
nginx側の設定
/etc/nginx/nginx.confに、拡張子が「.php」へのアクセスの場合の処理を追加します。
追加する箇所は、serverディレクティブの中です。
location ~ .php$ { fastcgi_pass unix:/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; }
locationディレクティブ内で特に注意が必要なのはfastcgi_passで、UNIXドメインソケットを利用する場合、ソケットファイルのパスが正しく設定する必要があります。
今回は、「/run/php-fpm/php-fpm.sock」ですので、そのように変更しています。
以上の設定が完了したら、systmctlコマンドでphp-fpmとnginxを起動します。
sudo systemctl start php-fpm sudo systemctl start nginx
phalcon-devtoolのインストール
phalcon-devtoolsのインストールには、composerを使う方法とgithubからソースをクローンしてインストールする方法がありますが、ここではgithubからソースをクローンしてインストールしてみます。
# phalcon-devtoolsのリポジトリをクローンして/usr/local/srcに移動 git clone https://github.com/phalcon/phalcon-devtools.git && sudo mv ./phalcon-devtools /usr/local/src/ # phalconコマンドでphalcon-devtoolsが実行できるようにシンボリックリンクを作成 sudo ln -s /usr/local/src/phalcon-devtools/phalcon.php /usr/local/bin/phalcon
以上でphalcon-devtoolsがインストールできました。
簡単なプロジェクトを作成してみる
準備が少し大変でしたが、いよいよphalconで動くアプリケーションを作る準備が整いました。
プロジェクトを作成するディレクトリに移動して、プロジェクトを作ってみます。
cd /var/www/html phalcon project myapp simple Phalcon DevTools (3.2.12) Success: Controller "index" was successfully created. /var/www/html/myapp/app/controllers/IndexController.php Success: Project 'myapp' was successfully created. Please choose a password and username to use Database connection. Used default:'root' without password.
これでsimpleタイプのPhalconプロジェクトが生成されました。
nginxのドキュメントルートを「/var/www/html/myapp/public」に変更し、localhostでアクセスしてみて、「Congratulations!」と表示されれば成功です。
phalcon scaffoldを使ってザッと作ってみたいと思いますが、その前に、まずはDBの設定をする必要があります。
DBの設定は、「./app/config/config.php」で行います。
phalconコマンドには、コマンドラインからDBのテーブルを作成する機能がないので、以下のSQLを使って先にテーブルを作成します。
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL, `email` varchar(255) NOT NULL, `phone` varchar(16) DEFAULT NULL, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT NULL, `deleted_at` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
作成できたら、phalcon scaffoldコマンドでコントローラー、モデル、ビューファイルを一気に作成します。
phalcon scaffold users Phalcon DevTools (3.2.12) Success: Model "Users" was successfully created. /var/www/html/myapp/app/controllers/UsersController.php /var/www/html/myapp/app/views/layouts/users.phtml /var/www/html/myapp/app/views/users/index.phtml /var/www/html/myapp/app/views/users/search.phtml /var/www/html/myapp/app/views/users/new.phtml /var/www/html/myapp/app/views/users/edit.phtml
ブラウザで「http://localhost/users」にアクセスし、検索画面が表示されていれば成功です。
まとめ
今回はPHPフレームワークでは最速とも言われるPhalconフレームワークを紹介しました。
サーバー側の設定は、PHP5.4.0 以降ではPHPのビルトインサーバー(http://php.net/manual/ja/features.commandline.webserver.php)を使って開発環境を簡単に作る方法もあります(phalcon serveコマンドで起動可)。
ただし、ビルトインサーバー自体は機能的にこのまま本番には持っていけるレベルのものではないという点にご注意ください。
ピュアPHPなフレームワークでは到底たどり着けない実行速度は、今までJavaやC++くらいしか選択肢がなかったレスポンスにシビアなリアルタイムの対戦ゲームなどにはうってつけです。
その代償とでも言うべきか、インストール方法が若干面倒ですので、この記事がお役に立てれば幸いです。