通信プロトコルの役割

TCPはストリームに基づいているため、クライアントが送信する要求データは水の流れのようにサーバーに流れ込みます。サーバーはデータが到着したことを検出した場合、データが完全であるかどうかを確認する必要があります。なぜなら、サーバーに到着するのは要求の一部のデータだけかもしれず、さらには複数の要求が連結して到着する可能性もあるからです。要求がすべて到着したか、または複数の連結された要求から要求を分離するためには、一套の通信プロトコルを定める必要があります。

Workermanでなぜプロトコルを定めるのか?

従来のPHP開発は基本的にWebベースで、ほとんどがHTTPプロトコルに基づいています。HTTPプロトコルの解析処理はWebサーバーが独自に行っているため、開発者はプロトコルに関することを気にする必要がありません。しかし、非HTTPプロトコルに基づいて開発する必要がある場合、開発者はプロトコルについて考慮する必要があります。

Workermanがすでにサポートしているプロトコル

Workermanは現在、HTTP、websocket、textプロトコル(付録の説明を参照)、frameプロトコル(付録の説明を参照)、wsプロトコル(付録の説明を参照)をサポートしています。これらのプロトコルに基づいて通信を行う場合、直接使用することができます。使用方法は、Workerを初期化する際にプロトコルを指定します。例えば:

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

// websocket://0.0.0.0:2345 はwebsocketプロトコルで2345ポートをリスニングすることを示します
$websocket_worker = new Worker('websocket://0.0.0.0:2345');

// textプロトコル
$text_worker = new Worker('text://0.0.0.0:2346');

// frameプロトコル
$frame_worker = new Worker('frame://0.0.0.0:2347');

// tcp Worker、socketによる直接的な伝送で、アプリケーション層のプロトコルは使用しません
$tcp_worker = new Worker('tcp://0.0.0.0:2348');

// udp Worker、アプリケーション層のプロトコルは使用しません
$udp_worker = new Worker('udp://0.0.0.0:2349');

// unix domain Worker、アプリケーション層のプロトコルは使用しません
$unix_worker = new Worker('unix:///tmp/wm.sock');

自作の通信プロトコルを使用する

Workermanに内蔵されている通信プロトコルが開発ニーズを満たさない場合、開発者は自分の通信プロトコルをカスタマイズできます。カスタマイズの方法については次の節で説明します。

ヒント:

Workermanにはtextプロトコルが内蔵されており、プロトコルの形式はテキスト+改行コードです。textプロトコルの開発とデバッグは非常に簡単で、ほとんどのカスタムプロトコルのシナリオで使用でき、telnetデバッグもサポートされています。開発者が独自のアプリケーションプロトコルを開発する場合、textプロトコルを直接使用でき、別途開発する必要はありません。

textプロトコルの説明は「付録 Textプロトコル部分」を参照してください。