基本プロセス

(簡単なWebsocketチャットサーバーの例を用います)

1、任意の場所にプロジェクトディレクトリを作成

例: SimpleChat/
ディレクトリに移動し、 composer require workerman/workerman を実行

2、vendor/autoload.phpをインクルード(composerインストール後に生成)

start.phpを作成し、vendor/autoload.phpをインクルード

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

3、プロトコルを選択

ここではTextテキストプロトコルを選択します(Workermanでカスタマイズされたプロトコルで、形式はテキスト+改行)

(現在、WorkermanはHTTP、Websocket、Textテキストプロトコルをサポートしています。他のプロトコルを使用する必要がある場合は、プロトコル章を参照して独自のプロトコルを開発してください)

4、必要に応じてエントリ開始スクリプトを書く

例えば、以下は簡単なチャットルームのエントリファイルです。

SimpleChat/start.php

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$global_uid = 0;

// クライアントが接続してきたときにuidを割り当て、接続を保存し、すべてのクライアントに通知
function handle_connection($connection)
{
    global $text_worker, $global_uid;
    // この接続にuidを割り当て
    $connection->uid = ++$global_uid;
}

// クライアントがメッセージを送信したとき、すべての人に転送
function handle_message(TcpConnection $connection, $data)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send("user[{$connection->uid}] said: $data");
    }
}

// クライアントが切断したとき、すべてのクライアントにブロードキャスト
function handle_close($connection)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send("user[{$connection->uid}] logout");
    }
}

// テキストプロトコルのWorkerを作成し、2347インターフェースをリッスン
$text_worker = new Worker("text://0.0.0.0:2347");

// プロセスを1つだけ起動、これによりクライアント同士のデータ転送が便利
$text_worker->count = 1;

$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';

Worker::runAll();

5、テスト

Textプロトコルはtelnetコマンドでテストできます

telnet 127.0.0.1 2347