بناء تطبيقات PHP عالية الأداء باستخدام Swoole في ServBay
يُعد ServBay بيئة تطوير ويب محلية صُممت خصيصًا للمطورين، حيث توفر منصّة مدمجة مسبقًا تدعم العديد من لغات البرمجة وقواعد البيانات والأدوات، بهدف تبسيط عملية تطوير المواقع والتطبيقات محليًا. في هذا الدليل، سنستعرض كيفية تمكين تطبيقات PHP باستخدام إضافة Swoole القوية ضمن بيئة ServBay، وبناء خدمات شبكة عالية الأداء.
ما هو Swoole؟
Swoole هو محرك اتصالات شبكة عالي الأداء ومبني على مفهوم الكوروتين (Coroutine)، صُمم خصيصًا للغة PHP. كُتب بلغة C البحتة ويوفر مزايا البرمجة غير المتزامنة والتوازي وكوروتين لشيفرات PHP. باستخدام Swoole، يستطيع مطور PHP تجاوز قيود نموذج الطلب-الإستجابة الكلاسيكي لخوادم الويب (مثل 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 أو خدمة PHP حسب التعليمات الظاهرة. يقوم ServBay بضبط بيئة PHP تلقائيًا لتحميل إضافة Swoole.
بعد إتمام الخطوات، يصبح بإمكانك استخدام إضافة Swoole على نسخة PHP المُحددة. للتحقق، نفذ الأمر التالي في الطرفية: php -m
وتأكد من وجود "swoole" في قائمة الإضافات المحمّلة.
TIP
ينصح ServBay افتراضيًا بحفظ مواقعك وملفات مشاريعك في المسارات التالية لتسهيل إدارة المواقع والإعدادات:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
وفي أمثلة هذا الدليل، سنعتمد هذه المسارات المقترحة.
بناء خادم HTTP بسيط باستخدام Swoole
سنقوم الآن بإنشاء خادم HTTP أساسي باستخدام Swoole لاستعراض كيفية معالجة طلبات الويب.
الخطوة 1: إنشاء مجلد المشروع
افتح الطرفية وأنشئ مجلد مشروع جديد حسب المسار المناسب لنظامك:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
الخطوة 2: كتابة ملف الخادم
في مجلد servbay-swoole-http
أنشئ ملفًا باسم server.php
وأضف المحتوى التالي:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// إنشاء مثال لخادم Swoole HTTP
// الاستماع على جميع واجهات الشبكة (0.0.0.0) عبر المنفذ 9501
$server = new Server("0.0.0.0", 9501);
// تسجيل رد نداء حدث بدء التشغيل
// يُنفذ عند بدء تشغيل الخادم بنجاح
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// هنا يمكنك تسجيل PID العملية الرئيسية أو غيرها من المعلومات
});
// تسجيل رد نداء حدث الطلب
// يُنفذ عند استقبال طلب 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();
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
39
40
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:
bash
php server.php
1
إذا سار كل شيء بشكل صحيح، سترى الإخراج التالي في الطرفية:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
يدل ذلك على تشغيل خادم Swoole HTTP والاستماع للطلبات على المنفذ 9501.
الخطوة 4: الوصول إلى الخادم
افتح متصفح الويب وزر إحدى العناوين:
http://localhost:9501
http://localhost:9501/info
ستجد أن الصفحة تعرض "Hello ServBay!" أو نص معلومات حول الطلب حسب المسار.
لإيقاف الخادم، ارجع للطرفية التي تشغّل السكربت واضغط Ctrl + C
.
معالجة اتصالات WebSocket باستخدام Swoole
يدعم Swoole بروتوكول WebSocket بشكل أصلي، ما يجعله مثاليًا لتطبيقات الاتصال الفوري مثل الدردشة، ألعاب الشبكة، أو خدمات الدفع اللحظية للبيانات.
الخطوة 1: كتابة سكربت خادم WebSocket
داخل مجلد المشروع (مثلاً servbay-swoole-http
أو أنشئ مجلدًا جديدًا مثل servbay-swoole-websocket
)، أنشئ ملفًا باسم websocket_server.php
وأضف التالي:
مسار المشروع:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// إنشاء خادم Swoole WebSocket
// خادم WebSocket يرث من خادم HTTP ويمكنه مزامنة معالجة طلبات HTTP أيضًا
$server = new Server("0.0.0.0", 9502); // الاستماع عبر المنفذ 9502
// تسجيل حدث بدء التشغيل، ينفذ عند بدء الخادم
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// تسجيل حدث إنشاء اتصال جديد
// $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!");
});
// تسجيل حدث استقبال رسالة
// $frame يحوي محتوى الرسالة مثل $frame->data، و $frame->fd معرف العميل
$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}");
// }
// }
});
// تسجيل حدث إغلاق الاتصال
// ينفذ عند إغلاق اتصال العميل
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// بدء تشغيل الخادم
$server->start();
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
39
40
41
42
43
44
45
46
47
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
46
47
ينشئ السكربت خادم WebSocket باستخدام Swoole على المنفذ 9502 ويعرّف ردود أفعال للأحداث الرئيسية (start
, open
, message
, close
). عند حدث message
، سيعيد الخادم رسالة للمرسل بعد إضافة بادئة توضيحية.
الخطوة 2: تشغيل خادم WebSocket
تأكد من وجودك في مجلد وجود ملف websocket_server.php
ثم شغّله كالتالي:
bash
php websocket_server.php
1
سترى في الطرفية:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
وهذا يدل على أن الخادم يعمل وينتظر اتصالات WebSocket على المنفذ 9502.
الخطوة 3: الاتصال بخادم WebSocket
يمكنك اختبار الاتصال بالعديد من الطرق:
الطريقة الأولى: باستخدام أدوات المطور في المتصفح
توفر معظم متصفحات العصر الحديث أدوات مطور (F12)، يمكن من خلالها اختبار اتصالات WebSocket.
افتح صفحة فارغة (مثل
about:blank
).افتح أدوات المطور وانتقل إلى واجهة "Console".
نفذ الشيفرة التالية:
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" أداة طرفية مبنية على Node.js لاختبار WebSocket.
تثبيت wscat: إذا لم تثبّت Node.js و npm، فقم بذلك أولاً. ثم ثبّت wscat:
bashnpm install -g wscat
1الاتصال بالخادم: من الطرفية، نفذ:
bashwscat -c ws://localhost:9502
1عند نجاح الاتصال يظهر مؤشر
>
.إرسال رسالة: أدخل رسالتك واضغط Enter:
bash> Hello ServBay via wscat
1سيرسل الخادم ردًا يظهر كالتالي:
bash< Hello, you sent: Hello ServBay via wscat
1وستلاحظ أيضًا تسجيلات في الطرفية التي تشغّل السكربت.
لإنهاء الاتصال عبر wscat، اضغط Ctrl + C
.
ملاحظات هامة
- مشكلة المنافذ: تأكد أن المنافذ المستخدمة (مثل 9501، 9502) متاحة وغير محجوزة لبرامج أخرى على النظام. إذا حدث تعارض في المنافذ، لن يتمكن Swoole من العمل.
- نسخة PHP: تأكد من استخدام نسخة PHP المفعّل فيها Swoole عند تشغيل السكربتات من الطرفية. تحقق من إصدار PHP بالأمر
php -v
، ويتيح ServBay غالبًا أداة سهلة لتبديل النسخ. - حالة الإضافة: إذا لم يعمل الخادم، تأكد من تفعيل إضافة Swoole لنسخة PHP المستخدمة وإعادة تشغيل ServBay أو خدمة PHP.
- إدارة العمليات الدائمة: خوادم Swoole عبارة عن عمليات دائمة في الذاكرة. في بيئة الإنتاج تحتاج لاستخدام أدوات إدارة العمليات مثل Supervisor, Systemd أو pm2 لضمان إعادة تشغيل الخادم تلقائيًا، في حين أن تشغيله يدويًا في بيئة ServBay المحلية غالبًا كافٍ.
الخلاصة
يتيح لك ServBay تفعيل واستخدام إضافة Swoole بسهولة، مما يفتح أمام مطوري PHP فرص بناء واختبار تطبيقات فائقة الأداء، سواء لخدمات HTTP التقليدية أو تطبيقات WebSocket الحديثة للتواصل اللحظي. بقوة Swoole وسهولة ServBay، يحصل مطورون PHP على أدوات قوية لبناء تطبيقات أكثر جودة وكفاءة. جرب Swoole ضمن ServBay اليوم واكتشف إمكانيات جديدة!