API開発に便利なPHPフレームワーク(2)- Phalcon–

API開発に便利なPHPフレームワークPhalcon編

PHPでウェブアプリケーションを開発する場合、フルスクラッチで書くことはほとんどなくなり、なんらかのフレームワークを使うことが一般的になってきました。

API開発ももちろんそうで、色んなフレームワークでAPI開発を加速させる機能が実装されています。

今回ご紹介するフレームワークは、開発もそうですが、作成したアプリケーションの実行速度が爆速になる魔法のようなフレームワーク、Phalconをご紹介します。

目次

  1. 実行速度が爆速になる、Phalconフレームワーク
  2. Phalconフレームワークでの開発を支えるツール
  3. CentOS7環境にphalconの動作環境を整える
    1. yumにremiリポジトリを追加
    2. yumで必要なパッケージをインストール
    3. phalconのインストール
    4. php-fpmとnginxの調整をして動作確認
    5. phalcon-devtoolのインストール

     

  4. 簡単なプロジェクトを作成してみる
  5. まとめ

実行速度が爆速になる、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には、以下のコマンドがあります。

コマンド名使い方の一例説明
infophalcon infoPhalconの実行環境の情報を表示
commandsphalcon commandsphalconサブコマンドの一覧表示
controllerphalcon controller ––name usersコントローラーファイルの作成
modulephalcon module ––name adminphalconプロジェクトの下に指定した名前のモジュールを作成
modelphalcon model ––name users ––extends baseモデルファイルの作成
all-modelsphalcon all-modelsDBのテーブル情報からモデルファイルを起こす
projectphalcon project my-project simplephalconの開発に必要な諸々を用意する
scaffoldphalcon scaffold ––table-name blogs一般的なCRUD処理に必要なコントローラー、モデル、ビューファイルを一括作成
migrationphalcon migrationDBのマイグレーションを実行
webtoolsphalcon webtools enablephalconコマンドをGUIで操作できるwebツールを有効化、または無効化
servephalcon servePHPのビルトインサーバーでwebアプリケーションを実行
consolephalcon consolePHPのREPL環境を起動(psyshを使うようです)

全てのphalconサブコマンドに「––help」オプションが設定されており、コマンドが持つオプションを確認することができます。

便利なオプションはまだまだありますので一度確認されることをおすすめします。

また、他のフレームワークのようにPHPファイルが存在しないことによるデメリットとして、素の状態ではIDEのコード補完が効きません。

この問題に対しては、phalcon-devtoolsに同梱されているスタブで解決でき、PhpStormやEclipseなどのIDEに読ませることで、コード補完が効くようになります。

CentOS7環境にphalconの動作環境を整える

phalconフレームワークを実行するために必要な作業は以下の通りです。

  1. yumでnginx、php、phalconのインストール
  2. nginxとphp-fpmの調整をして動作確認
  3. 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++くらいしか選択肢がなかったレスポンスにシビアなリアルタイムの対戦ゲームなどにはうってつけです。

その代償とでも言うべきか、インストール方法が若干面倒ですので、この記事がお役に立てれば幸いです。

  1. API開発に便利なPHPフレームワーク(1)- Laravel –
  2. API開発に便利なPHPフレームワーク(2)- Phalcon –
  3. API開発に便利なPHPフレームワーク(3)- FuelPHP –
  4. API開発に便利なPHPフレームワーク(4)- Symfony –
  5. API開発に便利なPHPフレームワーク(5)- CakePHP –
  6. API開発に便利なPHPフレームワークを比較 超主観的にランキングしてみた