Tiến trình tùy chỉnh
Trong webman, bạn có thể tạo và lắng nghe các tiến trình tùy chỉnh giống như trong workerman.
Lưu ý
Người dùng Windows cần sử dụngphp windows.php
để khởi động webman và có thể bắt đầu tiến trình tùy chỉnh.
Dịch vụ http tùy chỉnh
Đôi khi bạn có thể có yêu cầu đặc biệt và cần thay đổi mã lõi của dịch vụ http của webman. Trong trường hợp này, bạn có thể sử dụng tiến 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
{
// Ghi đè phương thức trong Webman\App ở đây
}
Thêm cấu hình sau vào config/process.php
use Workerman\Worker;
return [
// ... phần cấu hình khác...
'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' => [
'request_class' => \support\Request::class, // Cài đặt lớp request
'logger' => \support\Log::channel('default'), // Ví dụ nhật ký
'app_path' => app_path(), // Vị trí thư mục app
'public_path' => public_path() // Vị trí thư mục public
]
]
];
Gợi ý
Nếu muốn tắt tiến trình http có sẵn của webman, chỉ cần cài đặtlisten=>''
trong config/server.php
Ví dụ 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ả các thuộc tính onXXX đều là public.
Thêm cấu hình sau vào config/process.php
return [
// ... Cấu hình tiến trình khác được lược bỏ ...
// websocket_test là tên tiến trình
'websocket_test' => [
// Chỉ định lớp tiến trì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ụ tiến 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 có người dùng mới đăng ký không mỗi 10 giây
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 [
// ... Cấu hình tiến trình khác được lược bỏ
'task' => [
'handler' => app\TaskTest::class
],
];
Lưu ý: Nếu lược bỏ listen sẽ không lắng nghe bất kỳ cổng nào, lược bỏ count sẽ mặc định tiến trình là 1.
Mô tả cấu hình file
Cấu hình đầy đủ cho một tiến trình là:
return [
// ...
// websocket_test là tên tiến trình
'websocket_test' => [
// Chỉ định lớp tiến trình
'handler' => app\Pusher::class,
// Giao thức ip và cổng lắng nghe (tùy chọn)
'listen' => 'websocket://0.0.0.0:8888',
// Số tiến trình (tùy chọn, mặc định là 1)
'count' => 2,
// Người dùng chạy tiến trình (tùy chọn, mặc định là người dùng hiện tại)
'user' => '',
// Nhóm người dùng chạy tiến trình (tùy chọn, mặc định là nhóm người dùng hiện tại)
'group' => '',
// Tiến trình này có hỗ trợ reload hay không (tùy chọn, mặc định là true)
'reloadable' => true,
// Bật reusePort (tùy chọn, yêu cầu php>=7.0, mặc định là true)
'reusePort' => true,
// transport (tùy chọn, đặt là ssl khi cần kích hoạt ssl, mặc định là tcp)
'transport' => 'tcp',
// context (tùy chọn, khi transport là ssl, cần truyền đường dẫn chứng chỉ)
'context' => [],
// Tham số hàm tạo của lớp tiến trình, ở đây là tham số hàm tạo của lớp process\Pusher::class (tùy chọn)
'constructor' => [],
],
];
Tổng kết
Tiến trình tùy chỉnh trong webman thực sự chỉ là một gói đóng gói đơn giản của workerman. Nó tách cấu hình và công việc ra khỏi nhau và triển khai các cuộc gọi onXXX
của workerman thông qua phương thức của lớp. Các cách sử dụng khác hoàn toàn giống như trong workerman.