FuelPHP x Ratchet

- WebSocket Application -

FuelPHP & CodeIgniter ユーザの集い on October 12, 2013

Mamoru Otsuka (@madmamor)

Outline

  1. About Me
  2. WebSocketとは
  3. WAMPとは
  4. WebSocket開発のハードル
  5. Ratchetとは
  6. FuelPHPでRatchetを使うには
  7. サンプル
  8. 商用環境ですべきこと

About Me

Name : Mamoru Otsuka
WEB : http://madroom.net/
Twitter : @madmamor
Facebook : mamoru.otsuka
Blog : madroom project
GitHub : @mamor
Android Apps : madroom project
Location : Tama-Center, Roppongi

WebSocketとは

双方向通信を可能にする、ネットワーク用の通信規格
XMLHttpRequest(Ajax)の欠点を解決する技術として開発されている
http://ja.wikipedia.org/wiki/WebSocket

Ajaxで双方向通信っぽいことを行おうとすると

  • 一定間隔でサーバにリクエスト(ポーリング)

    →通信毎にコネクションを確立する

    →WebSocketなら同じコネクションで何度も通信

    →若干のラグが発生

    →WebSocketなら即時

  • レスポンスをわざと遅らせて擬似的にプッシュ(Comet)

    →HTTPの接続が長引きサーバの負担となる

    →WebSocketなら専用プロトコルでコネクションを維持してサーバの負担を軽減できる

WAMPとは

  • WebSocket Application Messaging Protocolの略
  • WebSocketのサブプロトコル
  • http://wamp.ws/
  • PubSubとRPCの提供

PubSubとは

RPCとは

  • Remote Procedure Callの略
  • 遠隔地(Remote)の一連の処理(Procedure)を呼び出す(Call)
  • 例: チャットルームのメンバ一覧を取得(パラメータはルームID)

WebSocket開発のハードル

PHPでの開発を主としていると

  • Node.js + Socket.IOやPlay Frameworkで開発しようとすると

    →WebSocket以外の学習コスト

    →使用言語変更のリスク(業務)

Node.js + Socket.IOやPlay FrameworkをPHPと組み合わせようとすると

Ratchetとは

フレームワークに組み込むと

  • フレームワークの機能(クラス/メソッド)が使える
  • セッションの共有も比較的容易

FuelPHPに組み込んでみました(Package化)

以降「Ratchetパッケージ」と呼びます

FuelPHPでRatchetを使うには

ZeroMQのインストール

  • http://zeromq.org/
  • メッセージングライブラリ
  • Ratchetを動かすだけなら必須ではない
  • Ratchetパッケージでは必須
  • FuelPHPのTask等からメッセージを送信する際に使用
  • 各OSへのインストール方法 Mac / Linux / Windows

Ratchetパッケージのインストール

Mac(MAMP)ZeroMQのインストール 1/2

libzmqのインストール


					# ダウンロード
					$ cd xxx # 任意のディレクトリ
					$ git clone git://github.com/zeromq/libzmq.git

					# インストール
					$ cd libzmq/
					$ sudo ./autogen.sh
					$ ./configure
					$ make
					$ sudo make install
				

libtoolやautoconfのnot foundエラーが出たら、以下の手順等でインストールして下さい。

  1. XcodeのGUIからCommand Line Toolsをインストール
  2. Mac Portsからlibtool、autoconf、automakeをインストール

Mac(MAMP)ZeroMQのインストール 2/2

php-zmqのインストール


					# php.hのエラーを回避するため、公式からPHPをDL
					$ cd xxx # 任意のディレクトリ
					$ wget http://www.php.net/get/php-5.4.20.tar.bz2/from/jp1.php.net/mirror -O php-5.4.20.tar.bz2
					$ tar zxf php-5.4.20.tar.bz2
					$ cd php-5.4.20
					$ ./configure
					$ cd ../
					$ mkdir /Applications/MAMP/bin/php/php5.4.4/include
					$ mv php-5.4.20 /Applications/MAMP/bin/php/php5.4.4/include/php

					# php-zmqのインストール
					$ cd xxx # 任意のディレクトリ
					$ git clone git://github.com/mkoppanen/php-zmq.git
					$ cd php-zmq/
					$ phpize
					$ ./configure # エラーが出たので、Mac Portsでre2cとpkgconfigのバージョンを最新にしました。
					$ make
					$ sudo make install
				

php.iniの編集


					# 以下を追記する。"php -i | grep 'Configuration File'" で表示されるphp.iniも忘れずに。
					extension=zmq.so
				

Linux(Ubuntu)にZeroMQをインストール

libzmqとphp-zmq(とpaco)のインストール


					$ sudo apt-get install -y libzmq-dev re2c pkg-config paco # pacoは任意
					$ cd xxx # 任意のディレクトリ
					$ git clone git://github.com/mkoppanen/php-zmq.git
					$ cd php-zmq/
					$ phpize
					$ ./configure
					$ make
					$ sudo paco -D make install
				

php.iniの編集はMacと同様

Windows(XAMPP)にZeroMQをインストール

DLLのインストール

php.iniの編集


					# 以下を追記する。"php -i | grep 'Configuration File'" で表示されるphp.iniも忘れずに。
					extension=php_zmq.dll
				

Ratchetパッケージのインストール

インストール


					# composer.jsonに以下を追記
					"mp-php/fuel-packages-ratchet": "dev-master"

					# インストール
					$ php composer.phar install # 二回目以降はupdate
				
app/config/config.php でRatchetパッケージを有効化

					'always_load' => array('packages' => array(
						'ratchet',
						...
				
packages/ratchet/config/ratchet.php を app/config/ 下にコピー

					# HELPの表示
					$ php oil r ratchet:help
				

サンプル

ファイルの作成

起動


				$ php oil r ratchet:ws My_Ratchet_Ws 1337
			

商用環境ですべきこと

ご清聴ありがとうございました。