カスタムプロセス

Webmanでは、Workermanのようにリスナーやプロセスをカスタマイズできます。

注意
Windowsユーザーは php windows.php を使用してWebmanを起動する必要があります。この方法でカスタムプロセスを起動できます。

カスタムHTTPサービス

特定のニーズがある場合、Webman HTTPサービスのコアコードを変更する必要があるかもしれません。その際、カスタムプロセスを使用できます。

例として、app\Server.phpを新規作成します。

<?php

namespace app;

use Webman\App;

class Server extends App
{
    // ここでWebman\Appのメソッドをオーバーライドします
}

config/process.phpに次のように設定を追加します。

use Workerman\Worker;

return [
    // ... 他の設定は省略 ...

    'my-http' => [
        'handler' => app\Server::class,
        'listen' => 'http://0.0.0.0:8686',
        'count' => 8, // プロセス数
        'user' => '',
        'group' => '',
        'reusePort' => true,
        'constructor' => [
            'requestClass' => \support\Request::class, // リクエストクラスの設定
            'logger' => \support\Log::channel('default'), // ロギングインスタンス
            'appPath' => app_path(), // アプリディレクトリのパス
            'publicPath' => public_path() // パブリックディレクトリのパス
        ]
    ]
];

ヒント
Webmanに組込まれたHTTPプロセスを停止したい場合は、config/server.phplisten=>''を設定するだけです。

カスタムWebSocketリスナーの例

app/Pusher.phpを新規作成します。

<?php
namespace app;

use Workerman\Connection\TcpConnection;

class Pusher
{
    public function onConnect(TcpConnection $connection)
    {
        echo "onConnect\n";
    }

    public function onWebSocketConnect(TcpConnection $connection, $http_buffer)
    {
        echo "onWebSocketConnect\n";
    }

    public function onMessage(TcpConnection $connection, $data)
    {
        $connection->send($data);
    }

    public function onClose(TcpConnection $connection)
    {
        echo "onClose\n";
    }
}

注意:すべてのonXXXプロパティはpublicです。

config/process.phpに次のように設定を追加します。

return [
    // ... 他のプロセス設定は省略 ...

    // websocket_testはプロセス名です
    'websocket_test' => [
        // ここでプロセスクラス、すなわち上で定義したPusherクラスを指定します
        'handler' => app\Pusher::class,
        'listen'  => 'websocket://0.0.0.0:8888',
        'count'   => 1,
    ],
];

カスタム非リスニングプロセスの例

app/TaskTest.phpを新規作成します。

<?php
namespace app;

use Workerman\Timer;
use support\Db;

class TaskTest
{

    public function onWorkerStart()
    {
        // 10秒ごとにデータベースに新しいユーザーが登録されているか確認します
        Timer::add(10, function(){
            Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
        });
    }

}

config/process.phpに次のように設定を追加します。

return [
    // ... 他のプロセス設定は省略

    'task' => [
        'handler'  => app\TaskTest::class
    ],
];

注意:listenを省略すると、どのポートもリスニングしません。countを省略するとプロセス数はデフォルトで1になります。

設定ファイルの説明

完全なプロセスの設定定義は次のようになります。

return [
    // ... 

    // websocket_testはプロセス名です
    'websocket_test' => [
        // ここでプロセスクラスを指定します
        'handler' => app\Pusher::class,
        // リスニングするプロトコル、IP、ポート(オプショナル)
        'listen'  => 'websocket://0.0.0.0:8888',
        // プロセス数(オプショナル、デフォルトは1)
        'count'   => 2,
        // プロセス実行ユーザー(オプショナル、デフォルトは現在のユーザー)
        'user'    => '',
        // プロセス実行ユーザーグループ(オプショナル、デフォルトは現在のユーザーグループ)
        'group'   => '',
        // このプロセスがreloadをサポートするか(オプショナル、デフォルトはtrue)
        'reloadable' => true,
        // reusePortを有効にするか
        'reusePort'  => true,
        // transport(オプショナル、SSLを有効にする必要がある場合はssl、デフォルトはtcp)
        'transport'  => 'tcp',
        // context(オプショナル、transportがSSLの場合、証明書のパスを渡す必要があります)
        'context'    => [], 
        // プロセスクラスのコンストラクタの引数、ここではprocess\Pusher::classのコンストラクタの引数(オプショナル)
        'constructor' => [],
        // 現在のプロセスを有効にするか
        'enable' => true
    ],
];

まとめ

Webmanのカスタムプロセスは、実際にはWorkermanのシンプルなラッパーです。設定とビジネスロジックを分離し、WorkermanのonXXXコールバックをクラスメソッドで実現しています。他の使い方は完全にWorkermanと同じです。