بناء تطبيقات PHP عالية الأداء باستخدام Swoole في ServBay
ServBay هو بيئة تطوير ويب محلية صُممت خصيصاً للمطورين، وتوفر مسبقًا العديد من البيئات البرمجية وقواعد البيانات والأدوات، بهدف تبسيط مهام التطوير على جهازك المحلي. في هذا الدليل سنركز على كيفية تمكين واستخدام إضافة Swoole في بيئة ServBay لتعزيز قدرات تطبيقات PHP وبناء خدمات شبكية عالية الأداء.
ما هو Swoole؟
Swoole هي محرك اتصالات شبكي عالي الأداء ومبني على الكوروترين (Coroutines) ومخصص للغة PHP. تم تطويره بلغة C لتقديم قدرات الشبكات غير المتزامنة (Asynchronous) والمتوازية باستخدام الكوروترين في PHP. وباستخدام Swoole، لم يعد المطور مقيدًا بنموذج الطلب-الاستجابة التقليدي (مثل Apache/Nginx + PHP-FPM)، بل يستطيع معالجة الطلبات عالية التزامن بكفاءة، مثل بناء خوادم ويب مقيمة في الذاكرة، معالجة المهام غير المتزامنة، أو خدمات الاتصال اللحظي مثل WebSocket.
أهم مزايا Swoole:
- أداء عالي: تنفيذ على مستوى لغة C، مع دعم IO غير متزامن، وتعدد العمليات/الخيوط.
- الكوروترين: يدعم كوروترين خفيفة الوزن، ما يتيح كتابة كود متزامن ينفذ غير متزامن، ويسهّل برمجة الواجهات غير المتزامنة.
- دعم بروتوكولات متعددة: دعم أصلي لـ TCP/UDP/HTTP/WebSocket وغيرها من بروتوكولات الشبكة.
- سهولة في الاستخدام: يوفر واجهات برمجية (API) ملفتة وسهلة للمطورين المعتادين على PHP.
- العمل كعملية دائمة: عكس تطبيقات PHP التقليدية، تبقى العمليات نشطة في الذاكرة، ما يقلل من كلفة تهيئة البيئة مع كل طلب جديد.
مع Swoole، تتحول PHP من مجرد لغة برمجة للويب إلى منصة لبناء تطبيقات شبكية متقدمة وعالية الأداء.
تفعيل Swoole في ServBay
أحد أهداف تصميم ServBay هو تسهيل إدارة وتفعيل إضافات PHP المتنوعة. وباعتبار Swoole أحد الإضافات الأساسية لتطوير PHP عالي الأداء، فهو مدمج مسبقًا في ServBay، ويمكنك تفعيله بسهولة عبر الخطوات التالية.
المتطلبات المسبقة:
- التأكد من تثبيت ServBay وعمله بشكل طبيعي.
- توفر إصدار واحد على الأقل من PHP مُثبت في ServBay.
خطوات التفعيل:
- افتح واجهة تطبيق ServBay.
- انتقل إلى قسم "الحزم (Packages)" أو إدارة إصدارات PHP. (ملاحظة: قد يختلف اسم القسم حسب إصدار ServBay، غالبًا ستجده في الواجهة الرئيسية أو الإعدادات)
- حدد إصدار PHP الذي ترغب بتفعيل إضافة Swoole عليه.
- ابحث عن خيار إضافة Swoole ثم فعّله بوضع علامة التفعيل. عادةً تعرض ServBay قائمة أو أزرار تبديل للإضافات المدمجة.
- احفظ التعديلات وأعد تشغيل ServBay أو خدمة PHP عند الحاجة كما يتم إرشادك. سيعيد ServBay إعداد بيئة PHP تلقائيًا لتحميل إضافة Swoole المطلوبة.
بعد ذلك يمكنك البدء باستخدام Swoole في إصدار PHP الذي اخترته. للتحقق، نفذ الأمر التالي في الطرفية وستجد swoole
ضمن الإضافات المحملة:
php -m
TIP
ينصح ServBay بوضع مواقعك الإلكترونية وملفات مشاريعك في المسار /Applications/ServBay/www
حتى يسهل إدارة المواقع وإعدادها. وسنلتزم بهذا المسار أيضاً في الأمثلة التالية.
بناء خادم HTTP بسيط باستخدام Swoole
سننشئ الآن خادم HTTP أساسي باستخدام Swoole لمعالجة طلبات الويب.
الخطوة 1: إنشاء مجلد المشروع
افتح الطرفية، وأنشئ مجلد مشروع جديد وفق توجيهات ServBay:
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
2
3
الخطوة 2: كتابة سكربت الخادم
أنشئ ملف server.php
داخل مجلد servbay-swoole-http
وأضف الكود التالي:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// إنشاء كائن خادم HTTP باستخدام Swoole
// الاستماع على كل واجهات الشبكة (0.0.0.0) على المنفذ 9501
$server = new Server("0.0.0.0", 9501);
// تسجيل دالة رد نداء لحدث بدء التشغيل (start)
// يتم تنفيذها عند بدء الخادم بنجاح
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// يمكن هنا تسجيل معرف العملية الرئيسية، وغير ذلك من المعلومات
});
// تسجيل دالة رد نداء لحدث الطلب (request)
// يتم تنفيذها عند استقبال أي طلب HTTP جديد
$server->on("request", function (Request $request, Response $response) {
// تعيين ترويسة الاستجابة
$response->header("Content-Type", "text/plain");
// معالجة المنطق حسب المسار أو بارامترات الطلب
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Request path: " . $path . "\n";
$content .= "Method: " . $request->server['request_method'] . "\n";
$content .= "Client IP: " . $request->server['remote_addr'] . "\n";
// يمكن الحصول على المزيد من معلومات الطلب من كائن $request
}
// إرسال جسم الاستجابة وإنهاء الطلب
$response->end($content);
});
// بدء تشغيل الخادم
$server->start();
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
39
40
هذا السكربت يقوم بإنشاء خادم HTTP بواسطة Swoole يستمع على المنفذ 9501، ويرسل استجابة نصية بسيطة "Hello ServBay!" في كل مرة. عند زيارة المسار /info
يعرض تفاصيل عن الطلب.
الخطوة 3: تشغيل خادم Swoole
تأكد من كونك في مجلد servbay-swoole-http
، ثم شغل السكربت باستخدام إصدار PHP المفعّل عليه Swoole في ServBay:
php server.php
عند نجاح التشغيل، سترى الخرج التالي:
Swoole HTTP server is started at http://0.0.0.0:9501
هذا يعني أن الخادم يعمل في الخلفية ويستمع على المنفذ 9501.
الخطوة 4: دخول الخادم باستخدام المتصفح
افتح متصفح الإنترنت وزر أحد العناوين التالية:
http://localhost:9501
http://localhost:9501/info
ستُعرض صفحة نصية بحالة "Hello ServBay!"، أو معلومات الطلب إذا دخلت على /info
.
لإيقاف الخادم، عد إلى نافذة الطرفية واضغط Ctrl + C
.
استخدام Swoole لمعالجة اتصالات WebSocket
يدعم Swoole بروتوكول WebSocket بشكل أصلي، ما يجعله مثاليًا لبناء تطبيقات تواصل لحظي مثل الدردشة أو الألعاب أو بث البيانات الفوري.
الخطوة 1: إعداد سكربت خادم WebSocket
داخل مجلد /Applications/ServBay/www/servbay-swoole-http
أو في مجلد جديد مثل servbay-swoole-websocket
، أنشئ ملف باسم websocket_server.php
وضع به الشيفرة التالية:
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// إنشاء خادم WebSocket باستخدام Swoole
// خادم WebSocket يمتد من خادم HTTP ويمكنه معالجة طلبات HTTP أيضاً
$server = new Server("0.0.0.0", 9502); // الاستماع على المنفذ 9502
// تسجيل حدث البدء (start) عند تشغيل الخادم
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// تسجيل حدث الفتح (open) عندما يتصل عميل جديد عبر WebSocket
// يوفر الكائن $request معلومات حول الاتصال مثل $request->fd وهو معرف الجلسة
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// يمكن إرسال رسالة ترحيب للعميل
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// تسجيل حدث الرسالة (message) لاستقبال رسائل WebSocket من العملاء
// الكائن $frame يحتوي على بيانات الرسالة ومعرف الجلسة المرسلة منها
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// ارسال رد منفرد للعميل
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// مثال للبث لجميع العملاء (يتطلب الاحتفاظ بقائمة الاتصالات)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // لا ترسل للمرسل نفسه
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// تسجيل حدث الإغلاق (close) عند انتهاء الاتصال من جانب العميل
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// بدء الخادم
$server->start();
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
39
40
41
42
43
44
45
هذا السكربت يبني خادم WebSocket على المنفذ 9502 مع معالجة للأحداث الأساسية: بدء الخدمة، فتح الاتصال، استلام الرسائل، إغلاق الجلسة. عند استقبال رسالة من عميل، يتم الرد عليه مباشرة.
الخطوة 2: تشغيل خادم WebSocket
تأكد من أنك في نفس مجلد websocket_server.php
، ثم شغل السكربت باستخدام إصدار PHP الصحيح من ServBay:
php websocket_server.php
عند نجاح التشغيل، ستظهر الرسالة:
Swoole WebSocket server is started at ws://0.0.0.0:9502
أي أن الخادم يعمل ويستقبل الاتصالات على المنفذ 9502.
الخطوة 3: الاتصال بالخادم واختبار WebSocket
هناك عدة طرق لاختبار الاتصال بهذا الخادم.
الطريقة الأولى: عبر أدوات المطوّر بالمتصفح
جميع المتصفحات الحديثة توفر أدوات مطوّر (عادةً بالضغط على F12)، ويمكنك من خلالها اختبار WebSocket كالتالي:
افتح صفحة جديدة (مثلاً:
about:blank
).فعّل أدوات المطور واذهب إلى قسم "الكونسول".
الصق الكود التالي:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // إرسال رسالة بعد الاتصال }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // استقبال الرسائل }; ws.onerror = function(event) { console.error("WebSocket error:", event); // عند حدوث خطأ }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // عند إغلاق الاتصال }; // يمكنك إرسال رسالة: ws.send("رسالتك") // لإغلاق الاتصال استخدم: ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21بعد تنفيذ الكود، راقب الكونسول ورسائل الخادم في الطرفية للتأكد من الوصول والاتصال.
الطريقة الثانية: استخدام أداة wscat عبر الطرفية
wscat
أداة سطر أوامر شهيرة لاختبار WebSocket تعتمد على Node.js.
تثبيت wscat: إذا لم يكن لديك Node.js و npm، ثبتهما أولًا. ثم ثبّت wscat بالأمر التالي:
bashnpm install -g wscat
1الاتصال بالخادم: شغّل الأمر:
bashwscat -c ws://localhost:9502
1ستظهر إشارة
>
بعد الاتصال.إرسال الرسائل: اكتب أي رسالة واضغط إنتر:
bash> Hello ServBay via wscat
1سيعيد الخادم الرد، وستظهر كالتالي:
bash< Hello, you sent: Hello ServBay via wscat
1كما يمكنك متابعة السجلات في نافذة الخادم.
لإنهاء الاتصال عبر wscat، اضغط Ctrl + C
.
نصائح مهمة
- تعارض المنافذ: تأكد من أن المنفذ الذي يستخدمه Swoole (مثل 9501 أو 9502) غير مستخدم من قبل تطبيقات أخرى على النظام، وإلا لن يعمل الخادم.
- إصدار PHP الصحيح: عند تشغيل السكربت، تأكد أنك تستخدم إصدار PHP الذي تم تفعيل Swoole عليه في ServBay. تحقق بالأمر
php -v
. غالباً توفر ServBay أداة لإدارة إصدارات PHP من سطر الأوامر. - حالة الإضافة: إذا تعذر بدء الخادم، تحقق مرة أخرى من تفعيل إضافة Swoole لإصدار PHP المعني، وأن خدمة ServBay أو PHP أُعيد تشغيلها بعد التعديل.
- إدارة العمليات المقيمة: خوادم Swoole تظل نشطة بالذاكرة. في الإنتاج يجب استخدام أداة إدارة عمليات مثل Supervisor أو Systemd أو pm2 لضمان استمرارها بعد الأعطال. في حالة التطوير المحلي مع ServBay، التشغيل المباشر كافٍ.
الخلاصة
بفضل ServBay، يمكنك تفعيل واستخدام إضافة Swoole بسهولة لبناء واختبار تطبيقات PHP عالية الأداء محليًا، سواء كانت خدمات HTTP تقليدية أو تطبيقات WebSocket اللحظية الحديثة. القدرات الرائعة لـ Swoole مع البيئة الميسرة من ServBay تفتح أمام مطوّري PHP آفاقًا جديدة لبناء تطبيقات أكثر كفاءة وفعالية. جرّب Swoole الآن مع ServBay وارتقِ بتطوير PHP الخاص بك!