إعداد وتشغيل تطبيقات Workerman ضمن ServBay
نظرة عامة
تهدف هذه الوثيقة لإرشاد مستخدمي ServBay حول كيفية إعداد وتشغيل تطبيقات Workerman المبتكرة وعالية الأداء للاتصال الشبكي غير المتزامن باستخدام بيئة PHP وComposer المدمجة في ServBay. يعد Workerman مكتبة قوية مبنية بالكامل بلغة PHP لإنشاء خدمات الشبكة التي تتطلب معالجة تزامن عالي مثل خوادم الويب، الاتصال الفوري، خوادم الألعاب وغيرها. يوفر ServBay منصة عمل جاهزة وسهلة الإعداد، مما يبسط كثيرًا متطلبات تهيئة بيئة Workerman.
ماهو Workerman؟
Workerman هو إطار مفتوح المصدر مكتوب كلياً بلغة PHP يوفر أداءً عاليًا لاتصالات الشبكة غير المتزامنة. يعتمد على آلية حلقة الأحداث (EventLoop) لتنفيذ عمليات الإدخال والإخراج غير المحجوبة، ما يسمح له بإدارة آلاف الاتصالات المتزامنة بسهولة. على عكس نماذج تطوير PHP التقليدية (مثل Apache/Nginx + PHP-FPM)، تعمل تطبيقات Workerman كمقيمة في الذاكرة وتستمع للاتصالات مباشرة، مما يلغي تكلفة التهيئة والتدمير في كل دورة طلب ويرفع الأداء بشكل ملحوظ.
يتيح Workerman للمطورين بناء:
- خوادم HTTP عالية الأداء يمكنها استبدال Apache/Nginx للطلبات البسيطة.
- خوادم WebSocket فورية للتطبيقات مثل غرف الدردشة ودفع البيانات الفوري.
- خوادم TCP/UDP مخصصة ببروتوكولات حسب الحاجة.
- أدوات سطر الأوامر، المهام المجدولة، وخدمات مصغرة.
أبرز ميزات وفوائد Workerman
- أداء فائق: يسمح النهج القائم على الأحداث والإدخال غير المحجوب بمعالجة آلاف الاتصالات المتزامنة بكفاءة عالية.
- دعم عدة بروتوكولات: يشمل دعمًا أصليًا لخوادم HTTP، WebSocket، TCP، UDP وغيرها، ويمكن التوسعة لبروتوكولات مخصصة.
- سهولة الاستخدام: واجهة API مبسطة تسهل البرمجة الشبكية غير المتزامنة وتسرع التعلّم للمبرمجين بلغة PHP.
- قابلية التوسع المرنة: يدعم نماذج تعدد العمليات للاستفادة من تعدد الأنوية وتحسين التوزيع الأفقي والتحميل. يدعم التكامل مع Composer والمكتبات الموجودة.
- التكامل مع نظام PHP: يمكن تضمين المكتبة بسهولة عبر Composer، والاستفادة من النظام البيئي الكامل لـ PHP.
- وضع العمليات الخلفية (Daemon): بإمكان التطبيق العمل كعملية خفية في الخلفية للاستقرار والاعتمادية في بيئة الإنتاج.
يمنح Workerman مطوري PHP الإمكانات لإنشاء حلول شبكية عالية الأداء وتزامن في الوقت الحقيقي.
إعداد بيئة Workerman على ServBay
يعد ServBay بيئة تطوير محلية متكاملة مخصصة للمطورين، ويحتوي على لغات وبرمجيات تشغيلية متعددة بما فيها PHP، Node.js، Python، Go، Java، إضافة لخوادم وقواعد بيانات شهيرة مثل Caddy، Nginx، Apache، MySQL، PostgreSQL، MongoDB، Redis وMemcached. أهم ميزة فيه أنه جاهز للتشغيل فوراً ويحتوي على Composer مُعد مسبقًا، ما يجعل تهيئة Workerman وتنفيذه سهلاً وسريعًا جداً.
ستوضح هذه الوثيقة عبر أمثلة بسيطة كيفية إعداد وتطوير تطبيقات Workerman على ServBay: خادوم HTTP، خادوم WebSocket، وخادوم TCP.
TIP
لإدارة المشاريع بشكل منظم، يُنصح بتخزين ملفات مشاريعك المحلية في المسارات التالية:
- على macOS:
/Applications/ServBay/www
- على Windows:
C:\ServBay\www
جميع أمثلة المسارات في هذه الوثيقة تعتمد هذا الموقع.
المتطلبات السابقة
قبل البدء، تأكد من الأمور التالية:
- تثبيت ServBay وتشغيله: قم بتنزيل أحدث نسخة من الموقع الرسمي لـ ServBay وتثبيتها.
- تفعيل PHP ضمن ServBay: من لوحة التحكم، شغّل إصدار PHP المناسب (Workerman يتطلب PHP 5.4 أو أحدث، يُفضّل PHP 7.x/8.x).
- معرفة أساسية ببرمجة PHP وأوامر الطرفية: بعض المعرفة بالسطر البرمجي وأوامر التيرمينال ستكون مفيدة هنا.
تثبيت Workerman
1. التأكد من توفر Composer
Composer مدمج مع ServBay. فقط احرص أن بيئة ServBay تعمل وإصدار PHP نشط. استخدم تيرمينال ServBay أو أي تيرمينال خارجي إذا كان PHP وComposer مُضافين لمسار النظام.
تحقق من تثبيت Composer عبر تنفيذ:
bash
composer -v
1
إذا كان Composer معداً بشكل صحيح في بيئة PHP ستظهر معلومات الإصدار. إذا لم يكن متوفراً: تأكد من أن ServBay يعمل وأن PHP مُفعل.
2. إنشاء مجلد المشروع
انتقل إلى مجلد الجذر الموصى به وابتكر مجلد جديد للمشروع ثم ادخل إليه:
على macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
على Windows:
cmd
cd C:\ServBay\www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
أنشأنا بذلك مجلد servbay-workerman-demo
كمجلد المشروع الرئيسي.
3. تثبيت Workerman عبر Composer
داخل المجلد، ثبّت Workerman وكافة المتطلبات عبر Composer:
مسار المشروع:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
composer require workerman/workerman
1
سيتم تحميل Workerman ومكتباته للمجلد الفرعي vendor
.
كتابة كود خادم HTTP عبر Workerman
الخادم HTTP هو أكثر تطبيقات Workerman شيوعاً. لإنشاء خادم ويب أو API عالي الكفاءة، أنشئ ملفاً باسم http_server.php
(أو أي اسم تفضله مثل server.php
) وأضف الكود التالي:
php
<?php
// استيراد ملف التحميل التلقائي من Composer لتفعيل مكتبة Workerman
require __DIR__ . '/vendor/autoload.php';
// استيراد كلاس Worker من Workerman
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// إنشاء كائن Worker مخصص للاستماع لبروتوكول وعنوان معين
// 'http://0.0.0.0:8080' ينشئ خادم ويب يستمع على كل الشبكات عبر المنفذ 8080
// يسمح هذا بالوصول للخادم من الجهاز الحالي أو أجهزة الشبكة الداخلية
$http_worker = new Worker('http://0.0.0.0:8080');
// تحديد عدد العمليات لمعالجة الطلبات
// العدد 4 يعني 4 عمليات مستقلة ويمكن تعديله حسب عدد أنوية المعالج
$http_worker->count = 4;
// تحديد منطق معالجة الرسائل القادمة من العملاء (طلبات HTTP)
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// إرسال استجابة بسيطة للعميل عبر HTTP
// يقوم Workerman بإدارة رؤوس الاستجابة تلقائياً
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// تشغيل كل كائنات Worker - بدء الحلقة الرئيسية
Worker::runAll();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
شرح الكود:
require __DIR__ . '/vendor/autoload.php';
: تحميل تلقائي لجميع المكتبات عبر Composer.use Workerman\...;
: استيراد الكلاسات الضرورية.new Worker('http://0.0.0.0:8080')
: إنشاء عامل Workerman ويَستمع على المنفذ 8080.$http_worker->count = 4;
: تحديد عدد العمليات لرفع قابلية التزامن.$http_worker->onMessage = function(TcpConnection $connection, Request $request) { ... };
: منطق استقبال الطلبات وإرسال الاستجابات.Worker::runAll();
: بدء حلقة الأحداث لجميع العمال لمعالجة الطلبات.
تشغيل خادم Workerman HTTP
انطلق إلى مجلد المشروع وشغل الخادم عبر:
مسار المشروع:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
php http_server.php start
1
أنماط التشغيل:
- الوضع الأمامي (Foreground): يشغل الخادم بشكل تفاعلي أمام المستخدم وتظهر السجلات في الطرفية. أوقفه عبر
Ctrl+C
. مثالي للتطوير. - وضع العمليات الخلفية (Daemon): لتشغيل التطبيق كخدمة خلفية في الإنتاج، استخدم
-d
:bashيتحول التطبيق للعمل في الخلفية وتنتقل السجلات للملفات.php http_server.php start -d
1
إدارة العمليات:
أوامر إدارة عمليات Workerman:
- تشغيل:
php http_server.php start
(أمامي) أوphp http_server.php start -d
(خلفي) - إيقاف:
php http_server.php stop
- إعادة التشغيل:
php http_server.php restart
- إعادة تحميل سلسة:
php http_server.php reload
- حالة العمليات:
php http_server.php status
بعد تشغيل الخادم، افتح متصفحك على http://localhost:8080
أو http://127.0.0.1:8080
وستشاهد نص الترحيب.
إنشاء خادم WebSocket عبر Workerman
يسمح بروتوكول WebSocket باتصال ثنائي مستمر في الوقت الحقيقي بين العميل والخادم، مثالي لتطبيقات الدردشة أو بيانات الوقت الحقيقي. يدعم Workerman ذلك بسلاسة.
كتابة كود خادم WebSocket
أنشئ ملف
websocket_server.php
وضع فيه:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // إنشاء خادم WebSocket على المنفذ 8081 $ws_worker = new Worker('websocket://0.0.0.0:8081'); // تشغيل 4 عمليات لمعالجة الاتصالات $ws_worker->count = 4; // عند إنشاء اتصال جديد $ws_worker->onConnect = function(TcpConnection $connection) { echo "New WebSocket connection from " . $connection->getRemoteIp() . "\n"; }; // عند استقبال رسالة من العميل $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received message: " . $data . "\n"; // إعادة إرسال الرسالة للعميل لإثبات الاستقبال $connection->send('ServBay Workerman received: ' . $data); }; // عند إغلاق الاتصال $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket Connection closed\n"; }; // عند حدوث خطأ (اختياري) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Error: $code - $msg\n"; }; // بدء جميع العمال Worker::runAll();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36تشغيل خادم WebSocket
نفذ الأمر التالي لبدء الخادم:
bashphp websocket_server.php start
1وللتشغيل كعملية خلفية استخدم
-d
. ثم قم بالاتصال بخادم WebSocket علىws://localhost:8081
.مثال: عبر Console في متصفح الإنترنت:
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket connection opened"); ws.send("Hello from Browser!"); // إرسال رسالة }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // استقبال الرد }; ws.onclose = function(event) { if (event.wasClean) { console.log("WebSocket connection closed cleanly, code=" + event.code + " reason=" + event.reason); } else { console.error("WebSocket connection died"); } }; ws.onerror = function(error) { console.error("WebSocket error:", error); }; // إغلاق الاتصال (اختياري) // ws.close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25عند النجاح سترى معلومات الاتصالات والرسائل في الطرفية والمتصفح.
إنشاء خادم TCP عبر Workerman
يمكن استغلال Workerman لإنشاء خوادم TCP متخصصة للتطبيقات مثل أنظمة الألعاب، إنترنت الأشياء، أو خدمات بروتوكولات مخصصة.
كتابة كود خادم TCP
أنشئ ملفاً باسم
tcp_server.php
وأضف التالي:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // إنشاء خادم TCP على المنفذ 8082 $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // تشغيل 4 عمليات $tcp_worker->count = 4; // عند إنشاء اتصال جديد $tcp_worker->onConnect = function(TcpConnection $connection) { echo "New TCP connection from " . $connection->getRemoteIp() . "\n"; // إرسال رسالة ترحيبية $connection->send("Welcome to ServBay Workerman TCP Server!\n"); }; // استقبال الرسائل من العميل $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received data: " . $data; // إعادة إرسال البيانات للعميل كاستجابة $connection->send('ServBay Workerman received: ' . $data); }; // عند إغلاق الاتصال $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP Connection closed\n"; }; // بدء العمال Worker::runAll();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33تشغيل خادم TCP
شغل الخادم عبر:
bashphp tcp_server.php start
1وللتشغيل خلفياً استخدم
-d
. ثم اتصل بالخادم عبر أي عميل TCP مثل telnet أو netcat:bash# بـ telnet telnet localhost 8082 # أو netcat nc localhost 8082
1
2
3
4
5فور الاتصال ستتلقى رسالة الترحيب ويمكنك اختبار تبادل البيانات مع الخادم.
ملاحظات هامة
- حجز المنافذ: تأكد أن المنافذ (8080، 8081، 8082) غير مشغولة من خدمات أخرى بالنظام. استخدم الأمر
lsof -i :رقم_المنفذ
للتحقق. - جدار الحماية: قد يمنع جدار حماية النظام وصول الأجهزة الخارجية للمنافذ، تأكد من إعداداته للوصل من الشبكة الداخلية إذا دعت الحاجة.
- علاقة Workerman بخوادم ويب ServBay: يعمل Workerman على منافذ منفصلة ومستقلة عن خوادم Caddy/Nginx في ServBay، ويُعالج الاتصالات مباشرة دون وسيط إلا في الحالات الخاصة.
- إصدار PHP: يجب أن يكون إصدار PHP متوافقاً مع متطلبات Workerman ومتوفراً في لوحة تحكم ServBay.
- الامتدادات البرمجية: يعتمد Workerman على امتدادات مثل
event
،posix
،pcntl
. معظمها مفعل بشكل افتراضي في ServBay - تحقق من التفعيل عند وجود مشاكل. - السجلات: في نمط العمليات الخلفية تحفظ السجلات في ملفات، لذا ينصح بالمراجعة الدورية لها.
الأسئلة الشائعة (FAQ)
- س: كيف أوقف خادم Workerman؟
- ج: إذا كان يعمل أمامياً أوقفه بـ
Ctrl+C
. إذا كان كعملية خلفية استعمل الأمرphp اسم_الخادم.php stop
في مجلد المشروع.
- ج: إذا كان يعمل أمامياً أوقفه بـ
- س: لماذا لا يعمل خادم Workerman؟
- ج: غالباً سبب المشكلة احتلال المنفذ. استعرض السجلات لمعرفة السبب أو استخدم أمر التحقق من المنافذ واختر منفذ غير مشغول.
- س: ما الفرق بين Caddy/Nginx في ServBay وبين Workerman؟ وأيهم الأنسب؟
- ج: خوادم Caddy/Nginx تعالج HTTP/HTTPS التقليدي بينما يتفوق Workerman في برمجة الشبكات الحديثة والتزامن العالي والتعامل مع WebSocket وتطبيقات الوقت الحقيقي. الاختيار حسب حاجتك - التطبيقات التقليدية لخوادم الويب، التطبيقات التفاعلية والمزامنة العالية لـ Workerman. يمكن المزج بين الاثنين حسب التصميم.
- س: هل يمكن تشغيل عدة تطبيقات Workerman على ServBay في نفس الوقت؟
- ج: نعم، شريطة أن يكون لكل تطبيق منفذ خاص به وتتم إدارة تشغيله عبر عمليات PHP منفصلة.
خلاصة
سواءً كنت مطور PHP يبحث عن الأداء العالي أو تطبيقات الزمن الحقيقي، يزودك ServBay ببيئة تطوير متكاملة، سهلة وآمنة للانطلاق مع Workerman. اكسب سرعة بدء التنفيذ، تحكم كامل في بيئة التشغيل، وركز جهدك على منطق الأعمال لا إدارة البيئة. خوادم HTTP، WebSocket، وTCP لمستقبل أكثر تزامنًا وحيوية، كلها بمتناول يدك بخطوات واضحة. نتمنى أن يكون هذا الدليل بداية سلسة وآمنة نحو عالم Workerman المتقدم!