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