البرمجة غير المتزامنة في PHP: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في البرمجة غير المتزامنة في PHP

تقليديًا، تُعتبر PHP لغة متزامنة: يتم تنفيذ كل طلب بشكل تسلسلي، مما يحجب التنفيذ حتى اكتمال العملية (مثل طلب قاعدة بيانات أو API). ومع ذلك، مع تزايد متطلبات أداء تطبيقات الويب، أصبحت البرمجة غير المتزامنة في PHP مطلوبة بشكل متزايد. يسمح الكود غير المتزامن بتنفيذ مهام متعددة في وقت واحد، دون انتظار اكتمال كل منها، مما يسرع بشكل كبير معالجة الطلبات ويقلل الحمل على الخادم.

في هذا الدليل، سنشرح المفاهيم الأساسية للبرمجة غير المتزامنة في PHP، ونستعرض المكتبات الشائعة (ReactPHP، Amp)، بالإضافة إلى الإمكانيات الحديثة للغة — Fiber والمولدات.



أساسيات عدم التزامن: Event Loop والإدخال/الإخراج غير المحظور

في قلب أي نهج غير متزامن يوجد Event Loop (حلقة الأحداث). وهي حلقة لا نهائية تتحقق مما إذا كان قد حدث أي حدث (مثل اكتمال طلب HTTP أو قراءة ملف). إذا حدث حدث، يتم تنفيذ المعالج المناسب. وفي الوقت نفسه، لا يتم حظر الخيط الرئيسي — يمكنه التبديل إلى مهمة أخرى.

الإدخال/الإخراج غير المحظور (Non-blocking I/O) هو مبدأ أساسي. في الكود المتزامن، يؤدي استدعاء file_get_contents() إلى حظر تنفيذ السكريبت حتى يتم تحميل الملف بالكامل. في الوضع غير المتزامن، تبدأ العملية وتستمر في تنفيذ كود آخر، وتأتي النتيجة عبر callback أو Promise.



مثال: طلب متزامن مقابل طلب غير متزامن

// كود متزامن (محظور)$start = microtime(true);$data1 = file_get_contents('http://example.com/api1');$data2 = file_get_contents('http://example.com/api2');echo "وقت التنفيذ: " . (microtime(true) - $start) . " ثانية"; // ~2 ثانية (إذا كان كل طلب يستغرق 1 ثانية)

// كود غير متزامن (ReactPHP)$loop = React\\EventLoop\\Factory::create();$client = new React\\Http\\Browser($loop);

$promise1 = $client->get('http://example.com/api1');$promise2 = $client->get('http://example.com/api2');

$promise1->then(function ($response) { echo "تم استلام الرد 1";});$promise2->then(function ($response) { echo "تم استلام الرد 2";});

$loop->run();// وقت التنفيذ ~1 ثانية (يتم تنفيذ الطلبات بالتوازي)


مكتبات البرمجة غير المتزامنة في PHP

حاليًا، المكتبتان الأكثر شيوعًا هما ReactPHP و Amp. توفر كلتاهما Event Loop و Promise، بالإضافة إلى مكونات جاهزة للعمل مع HTTP والمآخذ ونظام الملفات.



ReactPHP

ReactPHP هي مكتبة ناضجة موجودة منذ عام 2012. توفر وصولاً منخفض المستوى إلى حلقة الأحداث والعديد من المكونات: react/socket، react/http، react/dns وغيرها.

// مثال لخادم HTTP على ReactPHP$loop = React\\EventLoop\\Factory::create();$server = new React\\Http\\Server($loop, function (Psr\\Http\\Message\\ServerRequestInterface $request) {    return new React\\Http\\Message\\Response(        200,        ['Content-Type' => 'text/plain'],        "Hello, Async World!"    );});$socket = new React\\Socket\\Server('127.0.0.1:8080', $loop);$server->listen($socket);echo "الخادم يعمل على http://127.0.0.1:8080";$loop->run();


Amp

تستخدم Amp coroutines (المولدات القائمة على المولدات) وتوفر واجهة برمجة تطبيقات ذات مستوى أعلى. بدلاً من سلاسل then()، تستخدم yield و await، مما يجعل الكود يشبه الكود المتزامن.

// مثال مع Amp\\Amp\\Loop::run(function () {    $response = yield \\Amp\\Http\\Client\\HttpClient::request('http://example.com');    $body = yield $response->getBody()->buffer();    echo $body;});


Fiber: عدم التزامن في نواة PHP 8.1

بدءًا من PHP 8.1، تمت إضافة

المدونات

توصيات الكتب