DRY

Web関連の技術の事、食事/お酒の事、旅行の事など

Macでnginx+php-fpm+phalconをインストール

最近PHPがなぜか多くなってきたのですが、私も速いと言われているPHPFramework Phalcon High performance PHP framework を使う必要が出てきたので、環境をMacに作った際のメモを残します。
基本管理がめんどくさいのでbrewでやるようにしています。

■環境の確認

・Mac OSX 10.9 Mavericks
・nginx 1.4.3
PHP/PHP-FPM 5.5.6
・Phalcon 1.2.4
■まずはbrewで最新版PHP5.5.6(2013/11/15現在)のインストールです。
$ brew tap homebrew/dupes
$ brew tap josegonzalez/homebrew-php
$ brew options php55
$ brew install php55 --with-fpm --with-debug --with-mssql --with-homebrew-openssl
$ brew info php55
PEARの設定です。
$ chmod -R ug+w /usr/local/Cellar/php55/5.5.6/lib/php
$ pear config-set php_ini /usr/local/etc/php/5.5/php.ini
PHPUnit & Phingのインストールしておきます。
$ pear config-set auto_discover 1
$ sudo pear install pear.phpunit.de/PHPUnit
$ sudo pear install pear.phing.info/phing
xdebugもインストールしておきます。
$ brew install php55-xdebug
でこの時点で一度LINKをし直しておきます。
$ brew unlink php55
$ brew link php55
各種バージョン確認をしておきます。
$ php-fpm -v
PHP 5.5.6 (fpm-fcgi) (built: Nov 15 2013 13:59:40) (DEBUG)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
$ phpunit --version
PHPUnit 3.7.28 by Sebastian Bergmann.
$ phing -v
Phing 2.6.1

で次からいよいよPhalconのインストールですが、まずはどんなのがあるのか確認しておきます。

$ brew search phalcon
php53-phalcon php54-phalcon php55-phalcon
と言う事なのでphp55-phalconをインストールします。
■phalconインストール
$ brew install php55-phalcon
コマンドを叩くと下記のようなログが出ます。

==> Downloading https://github.com/phalcon/cphalcon/archive/v1.2.4.tar.gz
######################################################################## 100.0%
==> PHP_AUTOCONF="/usr/local/opt/autoconf/bin/autoconf" PHP_AUTOHEADER="/usr/local/opt/autoconf/bin/autoheader" /usr/local/Cellar/php55/5.5.6/bin/phpize
==> ./configure --prefix=/usr/local/Cellar/php55-phalcon/1.2.4 --with-php-config=/usr/local/Cellar/php55/5.5.6/bin/php-config --enable-phalcon
==> make
==> Caveats
To finish installing phalcon for PHP 5.5:
* /usr/local/etc/php/5.5/conf.d/ext-phalcon.ini was created,
do not forget to remove it upon extension removal.
* Restart your webserver.
* Write a PHP page that calls "phpinfo();"
* Load it in a browser and look for the info on the phalcon module.
* If you see it, you have been successful!
==> Summary
/usr/local/Cellar/php55-phalcon/1.2.4: 2 files, 2.2M, built in 30 seconds

「/usr/local/etc/php/5.5/conf.d/ext-phalcon.ini was created」と出ているので、このファイルをチェックすると

$ cat /usr/local/etc/php/5.5/conf.d/ext-phalcon.ini
[phalcon]
extension="/usr/local/Cellar/php55-phalcon/1.2.4/phalcon.so"
extensionを書いてくれているようなので、確認をすると
$ php -i | grep -i phalcon
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php55/5.5.6/lib/php/extensions/debug-non-zts-20121212/phalcon.so' - dlopen(/usr/local/Cellar/php55/5.5.6/lib/php/extensions/debug-non-zts-20121212/phalcon.so, 9): image not found in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php55/5.5.6/lib/php/extensions/debug-non-zts-20121212/phalcon.so' - dlopen(/usr/local/Cellar/php55/5.5.6/lib/php/extensions/debug-non-zts-20121212/phalcon.so, 9): image not found in Unknown on line 0
Additional .ini files parsed => /usr/local/etc/php/5.5/conf.d/ext-phalcon.ini,
phalcon
Phalcon Framework => enabled
Phalcon Version => 1.2.4
うん、Unableみたいです。。。
よくよく見るとと、「/usr/local/Cellar/php55/5.5.6/lib/php/extensions/debug-non-zts-20121212/phalcon.so」にアクセスしようとしてるみたいですが、brewでインストールした際に「==> ./configure --prefix=/usr/local/Cellar/php55-phalcon/1.2.4」のログが出ていたので、確認すると
$ ls -al /usr/local/Cellar/php55-phalcon/1.2.4
total 4840
drwxr-xr-x 4 user admin 136 11 15 14:08 ./
drwxr-xr-x 3 user admin 102 11 15 14:08 ../

  • rw-r--r-- 1 user admin 272 11 15 14:08 INSTALL_RECEIPT.json
  • rwxr-xr-x 1 user wheel 2473796 11 15 14:08 phalcon.so*

と言う事なので、このディレクトリにあるようです。
方法としては、/usr/local/etc/php/5.5/conf.d/ext-phalcon.iniのextensionパスを変えてもいいと思いますが、とりあえずコピーします。

$ cp /usr/local/Cellar/php55-phalcon/1.2.4/phalcon.so /usr/local/Cellar/php55/5.5.6/lib/php/extensions/debug-non-zts-20121212/
改めて確認します。
$ php -i | grep -i phalcon
Additional .ini files parsed => /usr/local/etc/php/5.5/conf.d/ext-phalcon.ini,
phalcon
Phalcon Framework => enabled
Phalcon Version => 1.2.4
問題なさそうです。

nginxの設定とphp-fpm.confの設定はhttp://d.hatena.ne.jp/ke-16/20130306/1362536213:過去のエントリをご覧ください。
nginx自体はbrewで最新にしておきます。

$ brew install nginx
==> Downloading http://nginx.org/download/nginx-1.4.3.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/nginx/1.4.3 --with-http_ssl_module --with-pcre --with-ipv6 --sbin-path=/usr/local/Cellar/nginx/1.4.3/bin/nginx --with-cc-opt
==> make
==> make install
==> Caveats
Docroot is: /usr/local/var/www

The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.

To have launchd start nginx at login:
ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
Then to load nginx now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
Or, if you don't want/need launchctl, you can just run:
nginx
==> Summary
/usr/local/Cellar/nginx/1.4.3: 7 files, 876K, built in 20 seconds

また、Phalconの公式サイトにもnginxの設定ドキュメントがありました。Nginx Installation Notes — Phalcon 1.3.0 documentation

Phalconの動作確認のため、公式サイトからチュートリアルを取得します。

$ cd /var/www
$ git clone https://github.com/phalcon/tutorial.git

publicとappフォルダがあると思いますが、publicフォルダをdocument rootとするみたいなのでnginx.confの設定をそこにします。

公式サイトのようにnginx.confを変更したのですが、下記のようにエラーが出てしまうので諦めて以前から動いている形にしました。
[error] 57954#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"
そうすると、nginx.confは以下のようになります。
user nginx;
worker_processes 2;

pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http{
include /usr/local/etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;

#sendfile on;
keepalive_timeout 0;
server_tokens off;
underscores_in_headers on;


server {
listen 80;
server_name localhost;
charset utf-8;
rewrite_log on;

root /usr/local/var/www/public;
index index.html index.htm index.php;

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

location ~ ^(.+\.php)(/.*)?$ {
fastcgi_split_path_info ^(.+\.php)(/.*)?$;

set $script_filename $document_root$fastcgi_script_name;

if (!-e $script_filename) {
return 404;
}

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;

fastcgi_param APPLICATION_ENV development;
fastcgi_param SCRIPT_FILENAME $script_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}

location ~ /\.ht {
deny all;
}
}
}

これで準備が整ったはずなので、実際に動かしてみます。

チュートリアルのソースに中身関しては、参考にさせて頂いたこちらのサイトが良いと思います。
Phalcon PHPを使ってみる。 » 新人Webエンジニアの記録。

php-fpmとnginxを起動します。

$ sudo php-fpm
$ sudo nginx
後はブラウザから http://localhost にて確認するだけです。

後はDeveloper Toolもあって簡単にプロジェクト生成が出来るようです。
Phalcon Developer Tools — Phalcon 1.3.0 documentation

参考サイト
高速なPHPフレームワークPhalconを使ってみた~プロジェクト作成 - k-motoyan888's diary

では使い倒してその噂の速さと実感したいと思います。