コンストラクタ __construct
説明:
Worker::__construct([string $listen , array $context])
Workerコンテナのインスタンスを初期化し、コンテナのいくつかの属性やコールバックインターフェースを設定して特定の機能を実現します。
パラメータ
$listen (オプションパラメータ、省略するとポートをリッスンしない)
$listenパラメータが設定されている場合は、ソケットのリッスンを実行します。
$listen の形式は <プロトコル>://<リッスンアドレス> です。
<プロトコル> は以下の形式のいずれかです:
tcp: 例えば tcp://0.0.0.0:8686
udp: 例えば udp://0.0.0.0:8686
unix: 例えば unix:///tmp/my_file (Workerman>=3.2.7が必要)
http: 例えば http://0.0.0.0:80
websocket: 例えば websocket://0.0.0.0:8686
text: 例えば text://0.0.0.0:8686 (textはWorkermanに内蔵されたテキストプロトコルで、telnetと互換性があります。詳細は付録Textプロトコル部分を参照してください)
その他のカスタムプロトコルについては、マニュアルのカスタム通信プロトコル部分を参照してください。
<リッスンアドレス> は以下の形式のいずれかです:
unixソケットの場合、アドレスはローカルのディスクパスになります。
非unixソケットの場合、アドレスの形式は <ローカルIP>:<ポート番号> です。
<ローカルIP>は0.0.0.0とすることで、ローカルのすべてのネットワークインターフェイスをリッスンできます。これには内部IP、外部IP、ローカルループバック127.0.0.1が含まれます。
<ローカルIP>が127.0.0.1である場合、ローカルループバックのみリッスンします。これにより、外部からはアクセスできません。
<ローカルIP>が内部IP、例えば192.168.xx.xxである場合、内部IPのみにリッスンします。この場合、外部のユーザーはアクセスできません。
<ローカルIP>に設定された値がローカルIPに属しない場合、リッスンを実行できず、Cannot assign requested addressエラーが表示されます。
注意:<ポート番号>は65535を超えてはなりません。<ポート番号>が1024未満の場合、リッスンするにはroot権限が必要です。リッスンするポートはローカルの未使用のポートでなければならず、そうでない場合はAddress already in useエラーが表示されます。
$context
コンテキストオプションをソケットに渡すための配列です。ソケットコンテキストオプションを参照してください。
例
WorkerをHTTPコンテナとして使用し、HTTPリクエストをリッスンします。
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$connection->send("hello");
};
// ワーカーを実行
Worker::runAll();
WorkerをWebSocketコンテナとして使用し、WebSocketリクエストをリッスンします。
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// ワーカーを実行
Worker::runAll();
WorkerをTCPコンテナとして使用し、TCPリクエストをリッスンします。
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('tcp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// ワーカーを実行
Worker::runAll();
WorkerをUDPコンテナとして使用し、UDPリクエストをリッスンします。
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('udp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// ワーカーを実行
Worker::runAll();
WorkerがUnixドメインソケットをリッスンします(Workermanはバージョン>=3.2.7が必要)
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('unix:///tmp/my.sock');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// ワーカーを実行
Worker::runAll();
何もリッスンしないWorkerコンテナは、一部の定期タスクを処理するために使用します。
use \Workerman\Worker;
use \Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function($task)
{
// 2.5秒ごとに実行
$time_interval = 2.5;
Timer::add($time_interval, function()
{
echo "task run\n";
});
};
// ワーカーを実行
Worker::runAll();
Workerがカスタムプロトコルのポートをリッスンします
最終的なディレクトリ構造
├── Protocols // これから作成するProtocolsディレクトリ
│ └── MyTextProtocol.php // これから作成するカスタムプロトコルファイル
├── test.php // これから作成するtestスクリプト
└── Workerman // Workermanソースコードディレクトリ、コードは変更しないでください
1、Protocolsディレクトリを作成し、プロトコルファイルを作成します
Protocols/MyTextProtocol.php(上記のディレクトリ構造を参考に)
// ユーザー定義プロトコルの名前空間はProtocolsに統一されます
namespace Protocols;
// シンプルなテキストプロトコル、プロトコル形式は テキスト+改行
class MyTextProtocol
{
// パケットの分割機能、現在のパケットの長さを返す
public static function input($recv_buffer)
{
// 改行文字を探す
$pos = strpos($recv_buffer, "\n");
// 改行文字が見つからない場合、完全なパケットではないことを示し、0を返してデータの待機を続ける
if($pos === false)
{
return 0;
}
// 改行文字を見つけた場合、現在のパケットの長さを返す(改行文字を含む)
return $pos+1;
}
// 完全なパケットを受信した後、自動的にdecodeでデコードされます。ここでは改行文字をtrimします
public static function decode($recv_buffer)
{
return trim($recv_buffer);
}
// クライアントにデータを送信する前に、自動的にencodeでエンコードします。その後、クライアントに送信します。ここでは改行を追加します
public static function encode($data)
{
return $data."\n";
}
}
2、MyTextProtocolプロトコルを使用してリクエストをリッスンします
上記の最終ディレクトリ構造を参照してtest.phpファイルを作成します。
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// #### MyTextProtocol worker ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");
/*
* 完全なデータ(改行で終わる)を受信後、自動的にMyTextProtocol::decode('受信したデータ')
* 結果は$dataを介してonMessageコールバックに渡されます。
*/
$text_worker->onMessage = function(TcpConnection $connection, $data)
{
var_dump($data);
/*
* クライアントにデータを送信すると、自動的にMyTextProtocol::encode('hello world')が呼び出され、
* その後、クライアントに送信されます。
*/
$connection->send("hello world");
};
// すべてのワーカーを実行
Worker::runAll();
3、テスト
ターミナルを開き、test.phpがあるディレクトリに移動し、php test.php startを実行します。
php test.php start
Workerman[test.php] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.2.7 PHP version:5.4.37
------------------------ WORKERS -------------------------------
user worker listen processes status
root none myTextProtocol://0.0.0.0:5678 1 [OK]
----------------------------------------------------------------
Press Ctrl-C to quit. Start success.
ターミナルを開き、telnetでテストします(Linuxシステムのtelnetを使用することをお勧めします)
ローカルテストだと仮定し、ターミナルで telnet 127.0.0.1 5678 を実行します。
その後、 hi と入力してEnterを押すと、データ hello world\n を受信します。
telnet 127.0.0.1 5678
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hi
hello world