通信プロトコルの役割
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プロトコル部分」を参照してください。