عمليات مخصصة

في 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, // إعداد فئة الطلب
            'logger' => \support\Log::channel('default'), // مثيل السجل
            'appPath' => app_path(), // موقع دليل التطبيق
            'publicPath' => public_path() // موقع الدليل العام
        ]
    ]
];

تلميح
إذا كنت تريد إيقاف عملية 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 ستكون عامة

أضف التكوين التالي في 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'    => [], 
        // معلمات بناء فئة العملية، هنا معلمات بنية `process\Pusher::class` (اختياري)
        'constructor' => [],
        // هل يتم تمكين العملية الحالية
        'enable' => true
    ],
];

ملخص

تعتبر العمليات المخصصة في Webman في الواقع مجرد تغليف بسيط لـ Workerman، حيث يتم فصل التكوين عن الأعمال، ويتم تنفيذ استدعاءات onXXX في Workerman من خلال طرق الفئات، وجميع الاستخدامات الأخرى مشابهة لـ Workerman تمامًا.