カスタムプロセス
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.php
でlisten=>''
を設定するだけです。
カスタム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と同じです。