عمليات مخصصة
في 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 تمامًا.