การกำหนดกระบวนการที่กำหนดเอง
ใน webman คุณสามารถกำหนดการฟังหรือกระบวนการได้เหมือนกับ workerman
หมายเหตุ
ผู้ใช้ Windows ต้องใช้php windows.php
เพื่อเริ่มต้น webman ในการเริ่มต้นกระบวนการที่กำหนดเอง
บริการ http ที่กำหนดเอง
บางครั้งคุณอาจมีความต้องการพิเศษบางอย่างที่ต้องการเปลี่ยนแปลงรหัสแกนของบริการ http ของ webman ในกรณีนี้ คุณสามารถใช้กระบวนการที่กำหนดเองเพื่อทำสิ่งนี้
ตัวอย่างเช่น สร้าง 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, // การตั้งค่า request class
'logger' => \support\Log::channel('default'), // อินสแตนซ์บันทึก
'appPath' => app_path(), // ตำแหน่งไดเรกทอรี app
'publicPath' => public_path() // ตำแหน่งไดเรกทอรี public
]
]
];
คำแนะนำ
หากต้องการปิดกระบวนการ http ที่มาพร้อมกับ webman เพียงตั้งค่าlisten=>''
ในconfig/server.php
ตัวอย่างการฟัง 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' => '',
// กระบวนการปัจจุบันสนับสนุนการรีโหลดหรือไม่ (สามารถเลือกได้ ค่าเริ่มต้นคือ true)
'reloadable' => true,
// เปิดใช้งาน reusePort หรือไม่
'reusePort' => true,
// transport (สามารถเลือกได้ เมื่อต้องการเปิด ssl ให้ตั้งค่าเป็น ssl ค่าเริ่มต้นคือ tcp)
'transport' => 'tcp',
// context (สามารถเลือกได้ เมื่อตั้งค่า transport เป็น ssl ต้องส่งเส้นทางของใบรับรอง)
'context' => [],
// พารามิเตอร์ของตัวสร้างคลาสกระบวนการ ซึ่งที่นี่เป็นพารามิเตอร์ของตัวสร้างของ class process\Pusher (สามารถเลือกได้)
'constructor' => [],
// เปิดใช้งานกระบวนการปัจจุบันหรือไม่
'enable' => true
],
];
สรุป
กระบวนการที่กำหนดเองใน webman จริง ๆ แล้วเป็นการห่อหุ้มที่ง่ายของ workerman มันแยกการตั้งค่าและธุรกิจออกจากกัน และใช้วิธีการของคลาสในการทำ callback onXXX
ของ workerman วิธีการอื่น ๆ ทั้งหมดเหมือนกับ workerman อย่างสมบูรณ์