إعداد وتشغيل تطبيق Workerman في ServBay
نظرة عامة
يهدف هذا الدليل إلى إرشاد مستخدمي ServBay حول كيفية إعداد وتشغيل تطبيقات الشبكة غير المتزامنة عالية الأداء المبنية على Workerman، وذلك باستخدام بيئة PHP و Composer المدمجة في ServBay على نظام macOS. Workerman هو مكتبة PHP قوية لبناء خدمات شبكية تتطلب معالجة متزامنة عالية مثل خوادم الويب، أنظمة الدردشة الفورية، خوادم الألعاب وغيرها. يوفر ServBay منصة تطوير جاهزة للاستخدام تسهل كثيرًا من عملية إعداد بيئة Workerman.
ما هو Workerman؟
Workerman هو إطار عمل مفتوح المصدر عالي الأداء للتواصل الشبكي غير المتزامن ومكتوب بالكامل بلغة PHP. يعتمد على آلية الدوران الحدثي EventLoop لتنفيذ عمليات الإدخال والإخراج غير المتزامنة وغير المحجوبة، مما يمكّنه من التعامل مع ملايين الاتصالات المتزامنة بكفاءة. وعلى عكس أنماط تطوير الويب التقليدية بالـ PHP (مثل Apache/Nginx + PHP-FPM)، فإن تطبيقات Workerman تعمل بشكل مقيم في الذاكرة وتبقى مستمرة لتستمع على منافذ معينة، وتتعامل مباشرة مع الاتصالات والبيانات بدون تدمير العملية بعد كل طلب. هذا يقلل من الاستهلاك ويحسن الأداء بشكل ملحوظ.
مع Workerman، بإمكانك بناء:
- خوادم HTTP عالية الأداء، والتي يمكنها استبدال Apache/Nginx في معالجة الطلبات البسيطة أو الديناميكية.
- خوادم WebSocket آنية لبناء تطبيقات مثل غرف الدردشة والبث المباشر.
- خوادم TCP/UDP مخصصة لأي بروتوكول.
- أدوات سطر أوامر، مهام مجدولة، خدمات مصغرة Microservices، وأكثر.
الخصائص الأساسية لـ Workerman ومزاياه
- أداء عالي: يعتمد على التنفيذ الحدثي و I/O غير المتزامن، مما يمكّنه من معالجة ملايين الاتصالات بكفاءة.
- دعم بروتوكولات متعددة: يدعم بروتوكولات HTTP، WebSocket، TCP، UDP مع إمكانية التمدد بأي بروتوكول آخر.
- سهل الاستخدام: واجهات برمجة تطبيقات بسيطة وواضحة تسهل من تطوير الشبكات غير المتزامنة لمبرمجي PHP.
- قابل للتمدد: يدعم نماذج العمليات المتعددة، لتسخير قوة المعالجات متعددة النوى وتوزيع الحمل. ويسهل التكامل مع مكتبات PHP الأخرى عبر Composer.
- اندماج مع بيئة PHP: كونه مكتبة PHP، فهو يندمج بسهولة مع بقية النظام البيئي لـ PHP ويدعم Composer في إدارة الاعتمادات.
- وضعية الخادم الظلي 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
لإدارة موحدة، توصي ServBay بحفظ جميع ملفات مواقعك ومشاريعك المحلية داخل مجلد /Applications/ServBay/www
. جميع مسارات المشاريع في هذا الدليل تعتمد على هذا المجلد.
المتطلبات الأساسية
يرجى التأكد من التالي قبل البدء:
- تم تثبيت ServBay ويعمل: قم بتحميل وتثبيت ServBay من الموقع الرسمي.
- PHP مفعّل ضمن ServBay: تأكد من تفعيل نسخة PHP التي ترغب باستخدامها عبر لوحة تحكم ServBay. Workerman يتطلب PHP 5.4 أو أحدث، ونوصي باستخدام PHP 7.x أو 8.x للأداء الأفضل.
- معرفة أساسية بـ PHP وسطر الأوامر: يجب أن تكون لديك خبرة في أساسيات PHP وتشغيل الأوامر عبر الطرفية.
تثبيت Workerman
1. التأكد من توفر Composer
يأتي Composer مدمجًا مسبقًا مع ServBay ولا تحتاج لتثبيته منفصلًا. تأكد فقط من تشغيل ServBay وتفعيل نسخة PHP التي تستخدمها. ServBay يهيّئ Composer تلقائيًا لكل نسخة PHP. تستطيع استخدام الطرفية الخاصة بـ ServBay أو الطرفية النظامية (إذا أضفت PHP وComposer لـ PATH) للدخول إلى بيئة PHP وتشغيل Composer.
افتح الطرفية ونفّذ الأمر التالي للتأكد من توفر Composer:
composer -v
إذا ظهرت لك معلومات إصدار Composer، فهذا يعني أنه مهيأ بشكل صحيح على بيئة PHP التابعة لـ ServBay. أما “الأمر غير موجود”، فتحقق ما إذا كان ServBay يعمل وPHP مفعّلة.
2. إنشاء مجلد المشروع
انتقل إلى مجلد المواقع الافتراضي وأنشئ مجلد جديد، ثم ادخل إليه:
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
2
3
في هذا المثال أنشأنا مجلدا باسم servbay-workerman-demo
ليحتوي ملفات مشروع Workerman.
3. تثبيت Workerman عبر Composer
في داخل مجلد المشروع (/Applications/ServBay/www/servbay-workerman-demo
)، استخدم Composer لتثبيت Workerman وذلك عبر الأمر التالي:
composer require workerman/workerman
سيقوم Composer بتنزيل مكتبة Workerman واعتمادياتها وحفظها تلقائيًا داخل مجلد vendor
في المشروع الحالي.
كتابة كود خادم Workerman HTTP
خادم HTTP هو أحد أكثر استخدامات Workerman شيوعًا، يمكن استغلاله لبناء تطبيقات ويب أو خدمات API عالية الأداء.
أنشئ ملف باسم http_server.php
(أو أي اسم آخر تفضله مثل server.php
) وضع فيه الكود التالي:
<?php
// استدعاء ملف التحميل التلقائي من Composer لتوفير فئات Workerman
require __DIR__ . '/vendor/autoload.php';
// استيراد الفئات المطلوبة من 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' تعني خادم HTTP على كل الواجهات على المنفذ 8080
// 0.0.0.0 يتيح الوصول محليا أو عبر الشبكة؛ 8080 رقم المنفذ المرتبط بالخادم
$http_worker = new Worker('http://0.0.0.0:8080');
// تعيين عدد عمليات Worker
// هنا 4، أي 4 عمليات PHP مستقلة متزامنة لمعالجة الطلبات (يُنصح بتعديلها حسب عدد أنوية المعالج)
$http_worker->count = 4;
// تعريف منطق المعالجة عند استقبال طلب من العميل
// $connection: يتيح إرسال استجابة للعميل
// $request: تفاصيل الطلب (رابط، رؤوس، جسم الطلب...)
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// إرسال استجابة نصية بسيطة للعميل
// Workerman يتولى تلقائيا إدارة رؤوس استجابة HTTP وغيرها من التفاصيل
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// تشغيل جميع عمليات Worker
// هذا هو الدوران الحدثي الرئيسي لتفعيل الاستماع ومعالجة الطلبات
Worker::runAll();
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
شرح الكود:
require __DIR__ . '/vendor/autoload.php';
: يستدعي ملف التحميل التلقائي Composer لإتاحة فئات Workerman.use Workerman\...;
: استيراد الفئات المطلوبة.new Worker('http://0.0.0.0:8080')
: إنشاء مثيل Worker مع تحديد HTTP كبروتوكول و0.0.0.0:8080 كعنوان.$http_worker->count = 4;
: يُحدد عدد عمليات خادم Workerman النشطة في نفس الوقت. زيادة العدد تحسّن التوازي.$http_worker->onMessage = function(TcpConnection $connection, Request $request) { ... };
: دالة رد نداء معالجة الطلبات. تستخدم $connection للرد على العميل و$request لقراءة المعلومات. تستخدم Response لبناء الرد.Worker::runAll();
: تشغيل دورة الأحداث الرئيسية لجميع العمال.
تشغيل خادم Workerman HTTP
من داخل مجلد المشروع (/Applications/ServBay/www/servbay-workerman-demo
)، شغل السيرفر بالأمر:
php http_server.php start
أنماط التشغيل:
- النمط الأمامي (Foreground): ينفذ عبر سطر الأوامر مباشرة، يظهر معلومات السيرفر في الطرفية ويمكن إيقافه بـ
Ctrl+C
. مناسب للتطوير أو التصحيح. - النمط الظلي (Daemon): لتشغيل Workerman في الخلفية استخدم الخيار
-d
:bashهنا سيتم تشغيل Workerman كخدمة خلفية وستتم كتابة السجلات في ملف لوج مخصص.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
ويجب أن ترى Hello ServBay Workerman HTTP Server!
.
إنشاء خادم WebSocket باستخدام Workerman
يدعم برتوكول WebSocket اتصالات ثنائية ثابتة بين العميل والخادم، مثالي للتطبيقات الآنية كالدردشة والألعاب. يدعم Workerman ذلك بشكل كامل.
كتابة كود خادم WebSocket
أنشئ ملفًا باسم
websocket_server.php
وأضف فيه:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // إنشاء خادم WebSocket على المنفذ 8081 // 'websocket://0.0.0.0:8081' تعني خادم WebSocket // Workerman يدير التفاوض WebSocket تلقائيًا $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 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
37
38تشغيل خادم WebSocket
شغّل الخادم في الطرفية من نفس مجلد المشروع:
bashphp websocket_server.php start
1ويمكنك تشغيله في الخلفية باستخدام
-d
. بعد التشغيل تستطيع إجراء اختبار بالاتصال بـws://localhost:8081
بواسطة أدوات WebSocket.مثال سريع في نافذة 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://0.0.0.0:8082' تعني خادم TCP // البروتوكول الافتراضي نصي (Text) حيث تُمثل نهاية السطر '\n' $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 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تشغيل خادم TCP
شغّل الخادم بالأمر التالي:
bashphp tcp_server.php start
1يمكنك تشغيله في الخلفية أيضًا باستخدام
-d
. بعد التشغيل يمكنك الاختبار عبر أي عميل TCP على المنفذlocalhost:8082
.مثال باستخدام الطرفية على macOS/Linux باستخدام Telnet أو Netcat:
bash# باستخدام telnet telnet localhost 8082 # أو باستخدام nc (netcat) nc localhost 8082
1
2
3
4
5عند الاتصال ستصلك رسالة الترحيب، ويمكنك إرسال أي نص (أدخل السطر واضغط Enter) وسيعاد إليك نصك من السيرفر.
ملاحظات هامة
- إشغال المنافذ: تأكد أن المنافذ التي يستخدمها Workerman (8080, 8081, 8082) غير مستعملة من تطبيقات أخرى أو نظام macOS نفسه. إن حدث تعارض فلن يبدأ Workerman وستظهر رسالة خطأ. افحص المنافذ بالأمر
lsof -i :رقم_المنفذ
. - الجدار الناري: قد يمنع جدار الحماية في macOS الوصول الخارجي لهذه المنافذ. عادة لا تختلف الأمور أثناء التطوير، ولكن إن أردت الوصول من أجهزة أخرى في الشبكة المحلية عليك تعديل إعدادات الجدار الناري.
- العلاقة مع خوادم ServBay (Caddy/Nginx): يعمل Workerman على منافذ مستقلة تمامًا عن خوادم Caddy أو Nginx المدمجة بـ ServBay. تطبيقات Workerman تدير الاتصالات مباشرة، ولا تتطلب وسيطًا إلا إذا أعددت عكسًا عبر reverse proxy. استخدام Workerman مناسب أكثر لحالات الاتصالات طويلة الأمد أو العالية التوافقية (أمثلة WebSocket)، بينما Caddy/Nginx لمعالجة الطلبات القصيرة التقليدية.
- إصدار PHP: استخدم إصدار PHP في ServBay متوافقًا مع الحد الأدنى المطلوب لـ Workerman. ServBay يأتي بعدة نسخ PHP مثبتة ويمكن تفعيل ما يناسبك من خلال اللوحة.
- الملاحق المطلوبة: يعتمد Workerman للأداء العالي على بعض إضافات PHP، مثل
event
(إن توفّرت ومفعّلة استُخدمت لتحسين الأداء)، وposix
، وpcntl
(للنموذج المتعدد العمليات). معظم الإضافات مفعّلة تلقائيا ضمن ServBay، وفي حال ظهور مشكلات تأكد من تفعيلها عبر لوحة التحكم. - السجلات: عند التشغيل بوضعية الخادم الظلي Daemon يتم حفظ الإخراجات في ملفات سجل (log). احرص على مراجعتهم بانتظام لرصد الحالة والأعطال.
الأسئلة الشائعة (FAQ)
- س: كيف أوقف خادم Workerman؟
- ج: إذا كنت مشغله في الواجهة الأمامية (باستخدام الأمر
start
)، فقط اضغطCtrl+C
. وإذا كان يعمل بالخلفية (start -d
) استخدم الأمرphp اسم_ملف_السيرفر.php stop
لإيقافه.
- ج: إذا كنت مشغله في الواجهة الأمامية (باستخدام الأمر
- س: لماذا تعذر تشغيل خادم Workerman؟
- ج: غالبًا السبب هو أن المنفذ المطلوب مستعمل من برنامج آخر. راجع رسائل الخطأ، وغير رقم المنفذ أو وقف البرنامج الآخر المسيطر على المنفذ باستخدام الأمر
lsof -i :رقم_المنفذ
.
- ج: غالبًا السبب هو أن المنفذ المطلوب مستعمل من برنامج آخر. راجع رسائل الخطأ، وغير رقم المنفذ أو وقف البرنامج الآخر المسيطر على المنفذ باستخدام الأمر
- س: ما الفرق بين Caddy/Nginx لدى ServBay و Workerman؟ وأيهم أختار؟
- ج: Caddy/Nginx خوادم ويب تقليدية تعالج طلبات HTTP/HTTPS بالاعتماد غالبًا على PHP-FPM، ومع نهاية كل طلب ربما تخرج عملية PHP. Workerman عبارة عن إطار عمل PHP يعمل بشكل مقيم في الذاكرة وخادم مبني داخليًا يتعامل مع بروتوكولات مثل HTTP, WebSocket, TCP، ويصلح أكثر للاتصالات الطويلة/الآنية/عالية التوافرية. الخلاصة: لمواقع، RESTful API استخدم Caddy/Nginx؛ وللتواصل الآني أو الألعاب أو إنترنت الأشياء استخدم Workerman. بإمكانك أيضًا الجمع بينهما (مثلاً عبر عكس Caddy/Nginx للطلبات إلى Workerman).
- س: هل يمكن تشغيل أكثر من تطبيق Workerman في ServBay بنفس الوقت؟
- ج: نعم. كل تطبيق Workerman يشغل عملية PHP مستقلة ويستمع على منفذ مختلف. فقط اكتب سكريبت منفصل لكل تطبيق، وشغلهم من نوافذ طرفية مختلفة أو بخلفية، ولا تنسَ التأكد من تفرّد المنافذ.
الخلاصة
بعد قراءتك لهذا الدليل، أصبحت الآن قادرًا على إعداد وتشغيل مشاريع Workerman على ServBay بسهولة. يتيح لك Workerman بناء تطبيقات شبكية عالية الأداء والاستفادة الكاملة من إمكانيات PHP للبرمجة غير المتزامنة. بفضل الدعم الجاهز لـ Composer و PHP في ServBay، أصبحت عملية التطوير أسرع وأكثر كفاءة، مما يسمح لك بالتركيز مباشرة على منطق أعمال تطبيقك دون الانشغال بالإعدادات البيئية. سواء كان هدفك بناء خوادم ويب فائقة السرعة أو منظومات WebSocket آنية، فإن ServBay هو شريكك المثالي لتطوير تطبيقات Workerman محليًا على macOS. نتمنى لك بداية موفقة مع Workerman!