読者です 読者をやめる 読者になる 読者になる

phpでsocket.ioを使うときのインストール方法をメモ

はじめに

しょっちゅうやるわけではないが、やる機会がそこそこ増えてきたので手順を自分用にメモしておく。ちなみに今fuelphpを使ってるのでそれに合わせて話を進めます

socket.ioのインストール

node.jsはインストールされていてnpmコマンドもすでに使える前提です

mkdir nodejs # nodejs用のディレクトリをつくる
cd nodejs
npm install socket.io@0.9 # socket.ioバージョン0.9をインストール

ElephantIOのインストール

phpからsocket.ioへemitするために使用する。ちなみにemitとはphpからsocket.ioへリクエストを送ることを言います。逆に受信することをonと言います
詳しくはこちらを確認してみてください

cd ~/tmp # ElephantIOをダウンロードするための作業ディレクトリ
wget --no-check-certificate https://github.com/Wisembly/elephant.io/archive/master.zip # ElepahtnIOをダウンロード
unzip master.zip # 解凍(elephant.io-masterというディレクトリができる)
mv ./elephant.io-master/src pathto_fuelphp/fuel/app/vendor/ElephantIO # 必要なファイルをfuelphpのvendorディレクトリ以下へ配置

動作確認用のスクリプトを準備

socket.ioではサーバ用スクリプト
Elephant.ioではクライアント用スクリプト
それぞれ準備します

socket.ioサーバ

サーバスクリプトを準備。ちなみに以下でポート番号3000で待ち受けるサーバスクリプトとなります
nodejs/chat.js(socket.io側)

var io = require('socket.io').listen(3000);
io.sockets.on('connection',function(socket) {
    console.log(socket);
});

で、socket.ioサーバを起動

% node chat.js
   info  - socket.io started

・・・ サーバへのアクセスなどがあるとここに情報が出力されます

ブラウザから以下へアクセスしてサーバが動いている事を確認する。とりあえずnot foundとか出てなければサーバが動いていることを確認できるのでokです
http://example.com:3000/socket.io/socket.io.js

Elephant.ioクライアント

クライアントスクリプトを準備。上記で作ったサーバへアクセスしてみるスクリプトです

fuel/app/tasks/emit.php

<?php
namespace Fuel\Tasks;
use ElephantIO\Client, ElephantIO\Engine\SocketIO\Version0X;

class Emit
{
    public static function run()
    {
        //ライブラリ読み込み(工夫がなくてすみません)
        require(APPPATH.'vendor/ElephantIO/AbstractPayload.php');
        require(APPPATH.'vendor/ElephantIO/Client.php');
        require(APPPATH.'vendor/ElephantIO/EngineInterface.php');
        require(APPPATH.'vendor/ElephantIO/Engine/AbstractSocketIO.php');
        require(APPPATH.'vendor/ElephantIO/Engine/SocketIO/Version0X.php');
        require(APPPATH.'vendor/ElephantIO/Engine/SocketIO/Session.php');
        require(APPPATH.'vendor/ElephantIO/Exception/MalformedUrlException.php');
        require(APPPATH.'vendor/ElephantIO/Exception/SocketException.php');
        require(APPPATH.'vendor/ElephantIO/Exception/UnsupportedActionException.php');
        require(APPPATH.'vendor/ElephantIO/Payload/Decoder.php');
        require(APPPATH.'vendor/ElephantIO/Payload/Encoder.php');

        $client = new Client(new Version0X("http://example.com:3000"));

        $client->initialize();
        $client->emit('action', ['foo' => 'bar']);
        $client->close();
    }
}

で、上記スクリプトを実行

php oil refine emit # fuelphpでのコマンドライン起動の記述になります

するとsocket.ioサーバを起動したコンソールにログがずらずらと出力されるかと思われます
とりあえずここまでできればサーバとクライアントともに準備が完了です

以上です


※追記
さすがに以下のようなファイルを用意したほうが楽ですね

vendor/ElephantIO/Autoloader.php

<?php
require(APPPATH.'vendor/ElephantIO/AbstractPayload.php');
require(APPPATH.'vendor/ElephantIO/Client.php');
require(APPPATH.'vendor/ElephantIO/EngineInterface.php');
require(APPPATH.'vendor/ElephantIO/Engine/AbstractSocketIO.php');
require(APPPATH.'vendor/ElephantIO/Engine/SocketIO/Version0X.php');
require(APPPATH.'vendor/ElephantIO/Engine/SocketIO/Session.php');
require(APPPATH.'vendor/ElephantIO/Exception/MalformedUrlException.php');
require(APPPATH.'vendor/ElephantIO/Exception/SocketException.php');
require(APPPATH.'vendor/ElephantIO/Exception/UnsupportedActionException.php');
require(APPPATH.'vendor/ElephantIO/Payload/Decoder.php');
require(APPPATH.'vendor/ElephantIO/Payload/Encoder.php');

呼出し側

<?php
namespace Fuel\Tasks;

// ElephantIO
use ElephantIO\Client, ElephantIO\Engine\SocketIO\Version0X;
require_once APPPATH . "vendor/ElephantIO/Autoloader.php";

class Emit
{
    public static function run()
    {
        // ElephantIO
        $client = new Client(new Version0X("http://example.com:3000"));

        $client->initialize();
        $client->emit('action', ['foo' => 'bar']);
        $client->close();
    }
}