Quy trình tùy chỉnh
Trong webman, bạn có thể tùy chỉnh lắng nghe hoặc quy trình giống như workerman.
Lưu ý
Người dùng Windows cần sử dụngphp windows.php
để khởi động webman trước khi bắt đầu quy trình tùy chỉnh.
Dịch vụ http tùy chỉnh
Đôi khi bạn có thể có nhu cầu đặc biệt nào đó, cần thay đổi mã lõi dịch vụ http của webman, lúc này bạn có thể sử dụng quy trình tùy chỉnh để thực hiện.
Ví dụ, tạo mới app\Server.php
<?php
namespace app;
use Webman\App;
class Server extends App
{
// Ở đây ghi đè lại phương thức trong Webman\App
}
Thêm cấu hình sau vào config/process.php
use Workerman\Worker;
return [
// ... Đoạn cấu hình khác đã bỏ qua ...
'my-http' => [
'handler' => app\Server::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // Số tiến trình
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'requestClass' => \support\Request::class, // Cài đặt lớp request
'logger' => \support\Log::channel('default'), // Ví dụ ghi nhật ký
'appPath' => app_path(), // Vị trí thư mục app
'publicPath' => public_path() // Vị trí thư mục public
]
]
];
Mẹo
Nếu bạn muốn tắt quy trình http tích hợp của webman, chỉ cần thiết lậplisten=>''
trongconfig/server.php
Ví dụ về lắng nghe websocket tùy chỉnh
Tạo mới 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";
}
}
Lưu ý: Tất cả thuộc tính onXXX đều là public
Thêm cấu hình sau vào config/process.php
return [
// ... Đoạn cấu hình quy trình khác đã bỏ qua ...
// websocket_test là tên quy trình
'websocket_test' => [
// Ở đây chỉ định lớp quy trình, chính là lớp Pusher đã định nghĩa trên
'handler' => app\Pusher::class,
'listen' => 'websocket://0.0.0.0:8888',
'count' => 1,
],
];
Ví dụ về quy trình không lắng nghe tùy chỉnh
Tạo mới app/TaskTest.php
<?php
namespace app;
use Workerman\Timer;
use support\Db;
class TaskTest
{
public function onWorkerStart()
{
// Kiểm tra cơ sở dữ liệu mỗi 10 giây xem có người dùng mới đăng ký hay không
Timer::add(10, function(){
Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
});
}
}
Thêm cấu hình sau vào config/process.php
return [
// ... Đoạn cấu hình quy trình khác đã bỏ qua
'task' => [
'handler' => app\TaskTest::class
],
];
Lưu ý: Nếu bỏ qua
listen
, quy trình sẽ không lắng nghe bất kỳ cổng nào, nếu bỏ quacount
, số quy trình mặc định là 1.
Giải thích tệp cấu hình
Cấu hình hoàn chỉnh cho một quy trình như sau:
return [
// ...
// websocket_test là tên quy trình
'websocket_test' => [
// Ở đây chỉ định lớp quy trình
'handler' => app\Pusher::class,
// Giao thức lắng nghe ip và cổng (tuỳ chọn)
'listen' => 'websocket://0.0.0.0:8888',
// Số tiến trình (tuỳ chọn, mặc định là 1)
'count' => 2,
// Tài khoản người dùng chạy tiến trình (tuỳ chọn, mặc định là tài khoản hiện tại)
'user' => '',
// Nhóm người dùng chạy tiến trình (tuỳ chọn, mặc định là nhóm hiện tại)
'group' => '',
// Quy trình hiện tại có hỗ trợ reload hay không (tuỳ chọn, mặc định là true)
'reloadable' => true,
// Có bật reusePort hay không
'reusePort' => true,
// transport (tuỳ chọn, khi cần bật ssl thì đặt là ssl, mặc định là tcp)
'transport' => 'tcp',
// context (tuỳ chọn, khi transport là ssl thì cần truyền đường dẫn chứng chỉ)
'context' => [],
// Tham số hàm khởi tạo của lớp tiến trình, đây là tham số hàm khởi tạo của lớp process\Pusher::class (tuỳ chọn)
'constructor' => [],
// Quy trình hiện tại có được kích hoạt hay không
'enable' => true
],
];
Tóm tắt
Quy trình tùy chỉnh của webman thực chất chỉ là một lớp bao bọc đơn giản của workerman, nó tách biệt cấu hình và nghiệp vụ, và triển khai các callback onXXX
của workerman thông qua các phương thức của lớp, các cách sử dụng khác hoàn toàn giống workerman.