高速phpフレームワークphalconで開発を始めるまで

# はじめに
題名通りphpフレームワークphalconで開発を始められるようになるまでの手順を書きたいと思います。
いやなんでphalconなの?流行ってるの?という疑問もあるかもしれませんが、少なくとも僕の知っている界隈では流行ってないですし触ったことがある人がいるのかも怪しいです。
そもそも僕も今回初めて触りました。
なのでまずは触ろうと思った理由から。

# なぜphalconなのか?
## とにかく処理が速い(らしい)から
一つ目の理由は上記の通りですが、この記事をご覧になっている方の中にもphpのフレームワークとしてphalconという名前を聞いたことがある方もいらっしゃるかと思います。
そして名前を聞いたことがある方は同時に「ものすごく速い」という話を一緒に耳に挟んでいる方が多いのではないでしょうか。
phpのフレームワークは数多く存在しますが、正直僕はcakeやFuel、laravel等を比較した際に各フレームワークごとに一番優れている機能を説明することはできません。
ただphalconはやたら速いという確固たる強みを持っている、これって結構すごいことだと思うんですよ。
そんな一点突破のストロングスタイルな所に非常に惹かれました。
その代わりにその他の機能についてはほぼ話を聞きませんが・・・。

## にもかかわらずいまいち流行っていないから
前述の早いという理由に関連するのですが、速いというのはそれだけでかなり魅力的なはず、なのにいまいち流行っていない感じがします。
ネットを見るとちらほらと案件で使用しているという書き込みを見かけたりはするのですが、やはりあまり多くはない印象です。
やたらインストールが面倒だったり処理が書きにくかったり等の欠点、
または速さ以外の点が他のフレームワークの長所と比べた際に劣って見えてしまうなど長所が霞んでしまうなにかがあるのでしょうか?

## かっこいいから※読み飛ばしていいです
まず「ファルコン」という名前の時点でかっこいい。
開発環境とかで「ファルコン使ってるよ」というのはきっとみんなも声に出して言いたい日本語なはず。
ちなみにファルコンは日本語で言うところの隼にあたり、おそらくそれをイメージしたであろうアイコンもクールでスタイリッシュ。
![phalcon1.png](https://qiita-image-store.s3.amazonaws.com/0/236058/dac46e99-f3a3-10e4-8d8f-6476b64517c3.png)
男の子だからね、こういうのには憧れてもしょうがないね。
(実際のファルコンのスペルは「Falcon」であり、フレームワークのスペルは「phalcon」となっていますが多分phpのフレームワークと言うことで頭の文字を変えて読みはそのままにしたのかと。)

この記事ではそんなphalconの導入を行い、welcomeページ的なものを出力するところまでを紹介したいと思います。
なのでこんなこと書いておいてなんですがここでは速さ及び長所・短所についての検証はしません。
記事が長くなってしまうのでゆるして。

# phalconはどんなフレームワーク?
くどいようですがとにかく速いらしい、でもそれ以外は何も知らなかったので環境構築前に公式サイトを少し見てみました。
[公式サイト](https://phalconphp.com/ja/)
↑正直日本語が選択できる時点でちょっと驚きました(正直環境構築にも困るくらいのサポートしかされていませんが・・・)

トップページを見ると**C拡張として提供されるフルスタックのPHPフレームワーク**と書いてあります。
C拡張ということでフレームワークとしての実態はphpファイルとして存在しないのですね。
ここが速さの秘密なのかもしれません。

そのまま下に進んでいくと

- 少ないオーバーヘッド
- MVC&HMVC
- 依存性の注入
- REST
- オートローダー
- ルーター

等の点が基本機能として挙げられていました。
さらに下へ進むと英語でですが(トップページからすでに日本語訳が完全じゃないのか・・・)
ORMやトランザクション、テンプレートエンジンやi18n(国際化)などもサポートされていそうなことがわかります。
ざっと見た限りではありますが他のフレームワークと遜色なさそうに見えますね。

# ドキュメント
続いて環境構築用のドキュメントを探したのですが、完全ではないものの公式で日本語訳してくれているようです。
https://docs.phalconphp.com/ja/3.4/introduction

正直全部英語であることも覚悟していたのでこれは嬉しい。
ただ有志の方による翻訳も行われているようで、今回の範囲内だけの話で言えば有志の翻訳の方が訳してくれている量が多いのでこちらをお勧めします。
https://docs.phalconphp.com/ja/3.4/introduction

# 環境構築
さていよいよ環境構築手順に入っていきます。

## ソースコードのclone
先にソースコードのcloneをしておきます。
任意の作業ディレクトリでgit cloneしましょう。
今回はappという名前でディレクトリを作成しました。
`git clone https://github.com/phalcon/cphalcon app`

## 必須要件
ドキュメントを見た所、php5.5以上が必須となっている他、下記の拡張もインストールが必要とのこと。

- curl
- gettext
- gd2 (Phalcon\Image\Adapter\Gdクラスを使う場合)
- libpcre3-dev (Debian/Ubuntu), pcre-devel (CentOS), pcre (macOS)
- json
- mbstring
- pdo_*
- fileinfo
- openssl

今回サーバーはvagrantで仮想環境を構築する予定だった為、下記のようなVagrantFileを作成しました。
先ほどcloneしたソースディレクトリを同期するように設定しておきます。
この後使用するのでポートフォワードの設定もしておきましょう。
もしこの設定を使用する場合は同期するフォルダやip、ポート番号等は各自の環境に合わせて変更していただいて問題ありません。
(この記事ではvagrantの説明は割愛します。)

```
Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.1"
  config.vm.synced_folder "../app","/home/app"
  config.vm.network "private_network", ip: "192.168.20.10"
  config.vm.network "forwarded_port", guest: 8000, host: 8000, host_ip: "localhost", auto_correct: true

  config.vm.provision "shell", inline: <<-SHELL
      yum install epel-release -y
      rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
      yum install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt -y

      php --version
  SHELL
end
```

とりあえずこれで
CentOS 7.1
PHP 7.1
の環境が作成できます。

`vagrant up` で仮想環境が立ち上がったら早速phalconのインストール作業に入ります。

## インストール
公式ドキュメントを見ると

>PhalconはPHP拡張モジュールとしてコンパイルされているため、
インストールは他の従来のPHPフレームワークとは多少異なります。
Phalconは、Webサーバーのモジュールとしてインストールしてロードする必要があります。

とあります。
ちょっと癖がありそうですがwebサーバーのモジュールとしてインストールするだけと考えれば問題なくできそうですね。

インストールの方法は色々あるようですが、今回は簡単そうなソースコードからのコンパイルを選択しました。
`vagrant ssh` で仮想環境にログインし、まずはビルドに必要なパッケージをインストールしましょう。

```bash
sudo yum install php-devel pcre-devel gcc make
```

パッケージのインストールが完了したら事前にcloneしておいたソースディレクトリに移動していよいよphalconのインストールを実行しましょう。
これは結構時間かかります(2~30分くらい?)

```
cd /home/app/build
sudo ./install
```

## phalconの拡張モジュール読み込み
前述の通りphalconはPHP拡張モジュールのため、iniファイルにて読み込みの設定をしてあげる必要があります。
`/etc/php.d/phalcon.ini` を作成しましょう。

```ini:phalcon.ini
extension=phalcon.so
```

中身は上記の一行のみでOKです。
作成したらiniファイル反映のために `sudo systemctl restart httpd` で一旦httpdサービスを再起動しましょう。

これでphalconがphpの拡張モジュールとして読み込まれたはずですので、一旦確認をしましょう。
phpinfoで確認可能です。
下記のコマンドでドキュメントルートにindex.phpを作成します。

```
echo "<?php phpinfo();" > /home/app/index.php
```

今回は同期されているディレクトリでもある`/home/app`をドキュメントルートとし、index.phpを作成しました。
作成したら `http://192.168.20.10` にアクセスします。
もし皆様の環境構築時にipを変更している場合は適宜変更してください。

<img width="1074" alt="スクリーンショット 2018-12-03 20.08.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/236058/c50166c9-fd11-3683-4747-d7fc2d0ab249.png">

いつものphpinfoの項目にPhalconのセクションが増えていることが確認できたらインストール完了です。


## 開発者ツールインストール
続いてプロジェクトの作成の方法を調べる為にチュートリアルに入ろうとしたところこんな一文が。
> とにかく始めたいのであれば、このガイドをスキップして、developer tools を使ってPhalconプロジェクトを自動的に作成することができます。 (あなたが立ち往生した場合、ここに戻って来ると良いでしょう)

開発時に使用できる便利なコマンドを提供してくれるツールが用意されているのですね。
Fuelでいうところのoilコマンドでしょうか。
せっかくなので使いましょう。

ソースはgitからcloneします。
今回の仮想環境ではgitを入れていないので一旦ホストOS側に戻ってcloneしましょう。
一番最初にphalconのソースclone時に作成したappディレクトリ内にcloneしちゃいます。

```
git clone git://github.com/phalcon/phalcon-devtools.git
```

cloneが完了したらゲストOSに入り、先ほどcloneしてきたディレクトリ内に移動、phalcon.shを実行します。(先頭の「.」も忘れずに)

```
cd /home/app/phalcon-devtools/
. ./phalcon.sh
```

完了したらphalcon.phpへのシンボリックリンクを作成して完了です。

```
ln -s /home/app/phalcon-devtools/phalcon.php /home/app/phalcon-devtools/phalcon
chmod +x /home/app/phalcon-devtools/phalcon
```

これで`phalcon`コマンドが使用できるようになっているはずです。
`phalcon commands`で使用可能なコマンドの一覧を確認してみましょう。

```
[vagrant@localhost phalcon-devtools]$ phalcon commands

Phalcon DevTools (3.4.0)

Available commands:
  info             (alias of: i)
  commands         (alias of: list, enumerate)
  controller       (alias of: create-controller)
  module           (alias of: create-module)
  model            (alias of: create-model)
  all-models       (alias of: create-all-models)
  project          (alias of: create-project)
  scaffold         (alias of: create-scaffold)
  migration        (alias of: create-migration)
  webtools         (alias of: create-webtools)
  serve            (alias of: server)
  console          (alias of: shell, psysh)
```

## プロジェクト作成
さて、プロジェクトの作成ですが、前述の通りphalconコマンドにで自動で生成できます。
`phalcon project`で生成可能なのですが、実行前に`phalcon project --help`でどのような指定が可能なのか確認してみます。

```
[vagrant@localhost phalcon-devtools]$ phalcon project --help

Phalcon DevTools (3.4.0)

Help:
  Creates a project

Usage:
  project [name] [type] [directory] [enable-webtools]

Arguments:
  help	Shows this help text

Example
  phalcon project store simple

Options:
 --name=s               Name of the new project
 --enable-webtools      Determines if webtools should be enabled [optional]
 --directory=s          Base path on which project will be created [optional]
 --type=s               Type of the application to be generated (cli, micro, simple, modules)
 --template-path=s      Specify a template path [optional]
 --template-engine=s    Define the template engine, default phtml (phtml, volt) [optional]
 --use-config-ini       Use a ini file as configuration file [optional]
 --trace                Shows the trace of the framework in case of exception [optional]
 --help                 Shows this help [optional]
```

Usageを見るとアプリケーション名(name)やベースとなるパスの指定(directory)の他にtypeなるものが指定できるようになっています。
Optionsを見ると`Type of the application to be generated (cli, micro, simple, modules)`と書いてありますね。
どうやらアプリケーションの規模や用途によって生成するプロジェクトのテンプレートを切り替えられるようです。
今回は最小でいいのでsimpleを使用します。
デフォルトでsimpleになっているようなので指定は不要ですね。

`enable-webtools`についてですが、今回は使用しませんでしたので詳細はわかりませんが指定すると開発に役立つデバッグ用の管理画面が使用できるようになるようです。

さて、それではいよいよプロジェクトの生成をしてみましょう。

```
cd /home/app
phalcon project phalcon-app
```

`/home/app`下に`phalcon-app`ディレクトリが作成されたら成功です。

## ビルトインサーバー起動
ドキュメントを読み進めていくとphpのビルトインサーバーでも手軽に動かせるとの記述が。
もうここまできたらどれくらい手軽に始められるのかの検証もしたいので使ってみましょう。
先ほど作成したプロジェクトフォルダに移動し、ビルトインサーバーを起動します。

```
cd /home/app/phalcon-app
php -S 0.0.0.0:8000 -t public .htrouter.php
```

起動後ブラウザで `http://localhost:8000` にアクセスしてみると・・・。

<img width="943" alt="スクリーンショット 2018-12-03 20.27.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/236058/b2b79815-d910-c619-f576-dfe39ca68458.png">

できました!
この記事書く為に最初環境構築したときはなんだかんだでそこそこ時間がかかったのですが、こうやって手順にまとめて見ると最初にうけた印象よりもずっと手軽に構築できるなと感じました。

# おわりに
環境構築をするに当たっていろいろ調べたのですが、やはり他の日本で流行っているフレームワークに比べて圧倒的に情報が少ないと感じました。
それでも今回のような本当に初歩の環境構築はまだ情報がある方で、現在もっとちゃんとphalconを触るために色々使い方を調べているのですが、
ドキュメントが日本語訳されていなかったり、そもそも検索しても情報が出てこなかったりで難航中です。

また、C拡張として提供されているが故の弊害ですが、コアソースを見て使い方を確認するという手段がとれないのも痛いですね。
ここら辺はとっつきにくい理由としてあげてもいいかもしれません。

冒頭でも述べたとおりウェルカムページの表示だけでしたので、興味を持った理由として挙げたスピードや短所および長所についてはなにも触れずに終わってしまいましたが、これから調べて使っていくうちに色々見つかるかと思います。
使ってみて気に入ったらそれらも別の記事として投稿できればいいなと。

なにはともあれアドベントカレンダー参加をきっかけに初めの一歩を踏み出せました。
興味があったとは言っても正直このような場が無ければ絶対にphalconに触ることは無かったと思います。
貴重な機会を頂きありがとうございます。

ここまで読んで下さった皆様もありがとうございました。

明日12/7は@nobuhiro-kobayashiさんの投稿です。
よろしくおねがいします。