追記: 2013/04/21
一部、内容が古くなっている箇所があります。最新の内容は、GitHubのREADME.mdに記載しています。
--
以前、以下の記事を書きました。
PHPでWebSocketを用いたチャットサンプル
http://madroom-project.blogspot.jp/2013/04/phpwebsocket.html
今回、上記で使用しているRatchetを組み込んだ、FuelPHPのパッケージを作ってみました。
* 以下、Ratchetパッケージとします。
https://github.com/mp-php/fuel-packages-ratchet
当記事では、Ratchetパッケージを、ローカル環境で動作させるまでの手順について書いておきます。
(1) ZeroMQのインストール
まず、ZeroMQをインストールします。RatchetのWampServerで使用します。(当記事のサンプルでは使用しません。)
各OSでのインストール手順は、以下になります。
Linux(Ubuntu): http://madroom-project.blogspot.jp/2013/04/ubuntu-phpzeromq.html
Mac(MAMP): http://madroom-project.blogspot.jp/2013/04/mampmaczeromq.html
Win(XAMPP): http://madroom-project.blogspot.jp/2013/04/xamppwindowszeromq.html
正しくインストール出来たかは、phpinfoで確認ができます。
ZeroMQは、Webとコマンド、双方で有効にして下さい。(php.iniが異なる場合が有るので注意です。)
(2) FuelPHPのインストール
FuelPHPをgit cloneするなりzipでDLするなりして、適切な場所に配置して下さい。
(3) Ratchetパッケージのインストール
Ratchetパッケージをgit submoduleするなりzipでDLするなりして、fuel/packages/ratchetとして配置します。
submoduleとして追加する場合、以下で可能です。
# FuelPHPのプロジェクトルートで実行 $ git submodule add git://github.com/mp-php/fuel-packages-ratchet.git fuel/packages/ratchet
(4) Ratchetパッケージが必要とする外部ライブラリのインストール
以下のコマンドを実行します。
$ cd fuel/packages/ratchet # Ratchetパッケージに移動 $ php composer.phar install # 必要な外部ライブラリのインストール* (1)のZeroMQが正しくインストールされていないと、エラーが発生します。
(5) 簡単なメッセージ送信機能を作ります。
fuel/app/config/config.php の always_load.packages にRatchetパッケージを追加します。
'always_load' => array( 'packages' => array( 'ratchet',fuel/app/classes/my/ratchet/ws.php を作成します。
<?php require PKGPATH.'ratchet/vendor/autoload.php'; class My_Ratchet_Ws extends Ratchet_Ws { public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(\Ratchet\ConnectionInterface $conn) { $this->clients->attach($conn); } public function onClose(\Ratchet\ConnectionInterface $conn) { $this->clients->detach($conn); } public function onMessage(\Ratchet\ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from != $client) { $client->send(Security::htmlentities($msg)); } } } public function onError(\Ratchet\ConnectionInterface $conn, \Exception $e) { $conn->close(); } } /* end of file ws.php */public/ws.htmlを作成します。
* 実際にはControllerから呼び出すViewで使用されるviewファイルになります。
* 'example.com'の箇所は、置換して下さい。
<html> <head> <script> var conn = new WebSocket('ws://example.com:8001'); // 接続時 conn.onopen = function(e) { console.log("Connection established!"); }; // メッセージ受信時 conn.onmessage = function(e) { console.log(e.data); }; function send() { var msg = document.getElementById("text").value; conn.send(msg); } </script> </head> <body> <input type="text" id="text" /> <input type="button" id="button" value="Send" onclick="send();" /> </body> </html>
(6) タスクから起動します。
* 第二引数のポート番号は、適宜置換して下さい。その際、(5)のws.htmlに書いてあるポート番号も変更して下さい。
$ php oil r ratchet:ws My_Ratchet_Ws 8001* 終了はctrl + cです。
* 商用環境では、Supervisorでの起動を推奨します。その方法は、改めて書きたいと思います。
(7) 二つのブラウザから、(5)のws.htmlにアクセスします。
コンソールに'Connection established!'と表示されることを確認します。
(8) どちらかのブラウザから、メッセージを入力してSendボタンを押します。
もう一方のブラウザのコンソールに内容が表示されることを確認します。
P.S.
僕自身、WebSocketについての学習をこれから始めるので、色々と手探り状態です。今後は、以下に備忘録を兼ねたサンプルを追加していこうと思っています。
https://github.com/mp-php/fuel-ratchet-samples
とりあえず、Ratchetサーバ側とでのSession共有方法と、RatchetのWampServerあたりをなる早で作ろうかなと思っています。
No comments:
Post a Comment