uzullaがブログ

uzullaがブログです。

CentOS6.xでHHVMを動かす&今度出版される書籍の宣伝

みなさんPHPやってますか!(挨拶)
私は先週Go言語書いてましたけど来週はPHPです!やったPHPだ!!

さておき、まずは宣伝

もうすぐ私が一部担当した書籍が出ます!!!
Webアプリエンジニア養成読本
和田 裕介, 石田 絢一 (uzulla), すがわら まさのり, 斎藤 祐一郎


本書籍は、ウェブアプリ(ウェブサービス)を作成した事が無い方向けに、ウェブってなんなの?という基礎知識から、PHP/Rubyを使って実際に簡単なアプリを作成し、さらには本番を運用するためにサーバーを設定してみる&どのような事を気を付ければ良いのか、等といった基礎的な事や勘所を一気に俯瞰して学んでいただく事が出来ます。

プログラミング自体の初心者(if文って何!?)というレベルの人にはちょいと難しいかとおもいますが、まぁそういった情報はすでに世に多くありますので、他のサイトや書籍などで補いつつ読んでいただければと思います。


当方が担当した部分はPHPの箇所であり、なんとPHPは5.5推奨、5.4以上を必須とし、Composerを利用しつつ、フルスタックではないフレームワークを用いてライブラリを一つづつ選定し構築、ついでにテストも書こう!という実に学びある、実践的俺得構成とさせていただいております。

特定のフレームワークに依存しない構成になっておりますので、実践的なPHPへの入門、御社の新人教育などにもいかがでしょうか、実際良い本だと思います。


本筋以外にも、なんかやたら書いたコラムはお役立ち情報から多少ポエミーなもの、初心者御用達のレンサバの事なども記載しており、一通りよんでいただければウェブアプリ製作の全体像が見えること間違いなしといった風体でございます。


「ウェブ…ウェブとは?」というウェブ初心者の方でも、第一章はあの人気サービスを運用しているゆーすけべー氏によるわかりやすい解説が記載されております。
「俺はコードかかないよ」という方も、3,4章はこえむ氏による実践的運用例が記載されております。
Windowsなんだけど…」という方も勿論ご安心ください、Windowsでも安心対応です。
「5.4とか…」とおっしゃる方もご安心ください、サンプルアプリは「一応」PHP5.3ケアもしておりますのでちょっと書き替えれば使えます。レンサバでの利用もある程度想定しておりますし、無料レンタルサーバーなどでの動作も一応チェックしております。(もしこのあたり需要がありそうなら、追記的なブログエントリを作成させていただきます)
「そもそもPHPとか…」という方だってご安心ください!!!!パーフェクトRuby著者、すがまさお氏によるRubyの章がありますので、私のPHPのページは読まなくたってお役立ちまちがいありません!!!!


「やった!これでだれでもウェブアプリエンジニアやで!!!」


ということで是非お買い求めください。


また、発売を記念して、池袋のジュンク堂書店にてイベントを行います。

http://www.junkudo.co.jp/mj/store/event_detail.php?fair_id=4314

「『Webアプリエンジニア養成読本』(技術評論社)刊行記念
Webアプリエンジニアが出来るまで」
ジュンク堂書店 池袋本店
開催日時:2014年03月20日(木)19:30 ~

こちらもご興味のあるかたは是非どうぞ。

ということで、やっと本題、HHVMの話

PHPerならもうご存じでしょうが、HHVMと呼ばれるPHP互換の高速な実行環境がございます。
http://www.hhvm.com/blog/

HHVMを使うと(当方の体感では)1.4〜4倍程度の高速化ができる感じとなっており、近い将来PHPerの強い武器になることマチガイナシ!という奴です。
拡張的な文法も追加されており、ヤバい感じになっています。
http://www.sitepoint.com/hhvm-hack-part-1/


しかしながら、Ubuntu等では一発ではいるものの、私が常用するCentOSだと多少面倒な感じになっておりました。(gccをいれなおしたりとか…)

が、ビルド済みのRPMを配布しているrepoを知りましたので、ご紹介します。

http://hop5.in/

CentOS6に入れてみた

残念ながら5.xはサポートしていませんので、6.4の環境を用意しました。

本家では手順としては以下で解説されております。
http://nareshv.blogspot.jp/2013/12/installing-hhvm-23-on-centos-65.html

!注意!
まだまだhhvmは癖がありますし、今回紹介するrepoもメジャーなものではありません。
自己責任でヨロシクお願い致します。
!注意!


さて、早速hhvmをいれてみましょう。
まずはepel(拡張パッケージ)をいれて、yum upgradeをやっておきます。
(以後、sudoとか毎回書くの面倒なので、rootで作業しています)

$ yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ yum upgrade

(上記URL、ブクマで指摘いただいたので「x86_64」にURLを修正しました。とはいえ、現時点では実はこれは同じ内容のファイルなので、先ほどまでの内容で入れた人でもどうこうする必要はありません)

次に/etc/yum.repo.dにhop5のrepoを利用する設定ファイルをDLして追加します。

$ cd /etc/yum.repos.d/
$ wget http://www.hop5.in/yum/el6/hop5.repo

用意ができましたので、早速いれましょう。

$ yum install hhvm

確認します。

$ hhvm --version
HipHop VM 2.4.0 (rel)
Compiler: tags/HHVM-2.4.0-0-gc82fcd8e6199c500454b1a8b930a876ef2c1522b
Repo schema: c63b08a9dc618c8a3eaea633d4d1776b668c75d6

やったね!手軽だ!!

hhvmをfastcgiで起動する

hhvmは単体でもhttpdとして動くのですが、普通は静的ファイルのサーブをしないので、今回はfastCGIで起動して、フロントにはnginxを使いたいと思います。

$ yum install nginx

nginxの設定を修正します。

$ vi /etc/nginx/conf.d/default.conf
ーーー
#以下修正
    location / {
        root   /var/www/htdocs;
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$args;
    }

#以下を server ディレクティブ内に追記
    location ~ \.php$ {
        root           /var/www/htdocs;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

以下でnginxを起動しておきます。

$ /etc/init.d/nginx start

必要ならば、iptables(パケットフィルタリング)を修正するのをわすれないでください。または、仮想マシンなどであって、インターネットに公開していないサーバーならば、以下で止めてもよいでしょう。

$ /etc/init.d/iptables stop

後は/var/www/htdocsディレクトリをつくって、お決まりのphpinfo()をおいておきます

$ mkdir -p /var/www/htdocs

/var/www/htdocs/index.phpを以下内容で作成

<?php
phpinfo();

ではhhvmを起動します。

$ cd /tmp #実際どこでもよいですが、pidファイルができます。
$ hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000
(以後出力がつづく、Ctrl+Cで終了)

この状態で、http://{サーバーのホスト名か、IPアドレス}/にアクセスし、「HipHop」と出力されれば成功です!やった!*1


うまくでない場合、nginxのログと、hhvmのコンソールに出力されるエラーを確認しましょう。
時間がかかってつながらない場合には、iptablesのルールなどポートブロック(ファイアウォール)が設定されていないか確認しましょう。

で、実際hhvmってホントにつかえるの?

それっぽいものをうごかしてみましょうか。
サンプルアプリTinitter(https://github.com/uzulla/Tinitter)をインストールしてみましょう。

#TinitterをDL
$ cd /var/www/
$ wget https://github.com/uzulla/Tinitter/archive/master.zip
$ yum install unzip
$ unzip master.zip
$ cd Tinitter-master

#Tinitter初期設定
$ cp config.php.sample config.php
$ sqlite3 sqlite.db < schema.sqlite3.sql
$ mv /var/www/htdocs /var/www/htdocs.old
$ ln -s /var/www/Tinitter-master/htdocs /var/www/htdocs

#Composerでライブラリをいれる
$ curl -sS https://getcomposer.org/installer | hhvm --php
$ hhvm composer.phar install

phpと同様に標準入力でコードをうけつけるには「hhvm --php」をつかいますが、なんやら文句を言われる事があります。特にComposerの環境チェックが不要なら「wget https://getcomposer.org/composer.phar」とやってもcomposer.pharができます)

ここまでやったらOKです、ブラウザでひらいてみましょう。うまくうごきましたか?
f:id:uzulla:20140223223327p:plain


このサンプルアプリはSlim Framework、PDO-sqlite、illuminate/Eloquentなど、色々なライブラリをつかっていますがhhvmでもちゃんとうごきますね!


勿論Unittestだってこの通り*2

$ hhvm ../vendor/bin/phpunit
PHPUnit 3.7.28 by Sebastian Bergmann.

Configuration read from /var/www/Tinitter-master/test/phpunit.xml

..........

Time: 1.06 seconds, Memory: 16.50Mb

OK (10 tests, 41 assertions)

Yay!!!HHVM!!

実運用するには

今回はhhvmをシェルで起動していますが、本番でつかうなら、hhvm起動を-m serverから-m daemonにしたり、まあ色々やる必要はあると思います。
そこらへんは皆さん頑張ってみてください、まだ「こうだ!」というのは無いとおもいます。

ちなみに、今回PuPHPetがhhvm対応したVagrantfileを出力できるようになったのでhop5を知ったのですが、あちらはSupervisordでdaemon化しているようでした。

https://puphpet.com/

最後にやっぱりする宣伝

今度本が(以下略)


(ちなみに、今回つかったサンプルアプリケーションのTinitterを解説しております)


是非宜しくお願い致します!!こちらからは以上です!

*1:HHVMはphpinfo()出力が非常に簡素ですね

*2:毎回hhvmって打つのが面倒なら、phpというファイル名にsymlink張っても良いですね