コンストラクタ __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