自定義進程
在webman中你可以像workerman那樣自定義監(jiān)聽或者進程。
注意
windows用戶需要使用php windows.php
啟動webman才能啟動自定義進程。
自定義http服務
有時候你可能有某種特殊的需求,需要更改webman http服務的內(nèi)核代碼,這時可以采用自定義進程來實現(xiàn)。
例如新建 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, // 進程數(shù)
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'requestClass' => \support\Request::class, // request類設置
'logger' => \support\Log::channel('default'), // 日志實例
'appPath' => app_path(), // app目錄位置
'publicPath' => public_path() // public目錄位置
]
]
];
提示
如果想關閉webman自帶的http進程,只需要在 config/server.php 里設置listen=>''
自定義websocket監(jiān)聽例子
新建 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,
],
];
自定義非監(jiān)聽進程例子
新建 app/TaskTest.php
<?php
namespace app;
use Workerman\Timer;
use support\Db;
class TaskTest
{
public function onWorkerStart()
{
// 每隔10秒檢查一次數(shù)據(jù)庫是否有新用戶注冊
Timer::add(10, function(){
Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
});
}
}
在config/process.php
中添加如下配置
return [
// ... 其它進程配置省略
'task' => [
'handler' => app\TaskTest::class
],
];
注意:listen省略則不監(jiān)聽任何端口,count省略則進程數(shù)默認為1。
配置文件說明
一個進程完整的配置定義如下:
return [
// ...
// websocket_test 為進程名稱
'websocket_test' => [
// 這里指定進程類
'handler' => app\Pusher::class,
// 監(jiān)聽的協(xié)議 ip 及端口 (可選)
'listen' => 'websocket://0.0.0.0:8888',
// 進程數(shù) (可選,默認1)
'count' => 2,
// 進程運行用戶 (可選,默認當前用戶)
'user' => '',
// 進程運行用戶組 (可選,默認當前用戶組)
'group' => '',
// 當前進程是否支持reload (可選,默認true)
'reloadable' => true,
// 是否開啟reusePort
'reusePort' => true,
// transport (可選,當需要開啟ssl時設置為ssl,默認為tcp)
'transport' => 'tcp',
// context (可選,當transport為是ssl時,需要傳遞證書路徑)
'context' => [],
// 進程類構造函數(shù)參數(shù),這里為 process\Pusher::class 類的構造函數(shù)參數(shù) (可選)
'constructor' => [],
//當前進程是否啟用
'enable' => true
],
];
總結
webman的自定義進程實際上就是workerman的一個簡單封裝,它將配置與業(yè)務分離,并且將workerman的onXXX
回調(diào)通過類的方法來實現(xiàn),其它用法與workerman完全相同。