การกำหนดกระบวนการที่กำหนดเอง

ใน 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 อย่างสมบูรณ์