البرمجة غير المتزامنة في PHP: دليل كامل مع أمثلة

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

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

ابدأ الدورة

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



تقليديًا، PHP هي لغة متزامنة: يتم تنفيذ كل طلب بشكل تسلسلي، مما يحجب التنفيذ حتى اكتمال عملية الإدخال/الإخراج. ومع ذلك، مع تزايد متطلبات الأداء لتطبيقات الويب، أصبحت البرمجة غير المتزامنة في PHP ضرورة. فهي تسمح بمعالجة آلاف الاتصالات المتزامنة، وتنفيذ المهام المتوازية، واستخدام موارد النظام بكفاءة.



في هذا الدليل، سنستعرض الأساليب العملية للبرمجة غير المتزامنة في PHP: من المفاهيم الأساسية إلى الأمثلة الواقعية باستخدام المكتبات الحديثة والإمكانيات المدمجة في PHP 8.1+.



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



في قلب أي تطبيق غير متزامن يوجد Event Loop (حلقة الأحداث). وهي حلقة لا نهائية تتحقق من وجود أحداث جديدة (طلبات، بيانات من قاعدة البيانات، ملفات) وتوزع معالجتها دون حجب التدفق الرئيسي.



الكود المتزامن يعمل كالتالي:

<?php// عملية محظورة - البرنامج ينتظر 5 ثوانٍsleep(5);echo "مرت 5 ثوانٍ";// الكود التالي سيتم تنفيذه فقط بعد sleepecho "ستظهر هذه الرسالة بعد 5 ثوانٍ";?>


النهج غير المتزامن باستخدام ReactPHP:

<?phprequire 'vendor/autoload.php';

use React\\EventLoop\\Factory;use React\\Promise\\Promise;

$loop = Factory::create();

// مؤقت غير محظور$loop->addTimer(5, function () { echo "مرت 5 ثوانٍ";});

echo "ستظهر هذه الرسالة فورًا";$loop->run();?>


في النسخة غير المتزامنة، الكود لا يُحجب: تظهر الرسالة فورًا، بينما يعمل المؤقت في الخلفية.



دليل عملي: من البسيط إلى المعقد



1. استخدام Fiber (PHP 8.1+)



Fiber هي آلية مدمجة للكوروتينات ظهرت في PHP 8.1. تسمح بإيقاف تنفيذ دالة واستئنافه لاحقًا دون حجب التدفق.



مثال على تنفيذ المهام بالتوازي باستخدام Fiber:

<?phpfunction fetchData(string $url): Fiber{    return new Fiber(function () use ($url) {        // محاكاة طلب HTTP        $ch = curl_init($url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_TIMEOUT, 5);                // إيقاف Fiber        Fiber::suspend(curl_exec($ch));        curl_close($ch);    });}

// إنشاء عدة Fibers$fiber1 = fetchData('https://api.example.com/data1');$fiber2 = fetchData('https://api.example.com/data2');

// تشغيل Fibers$result1 = $fiber1->start();$result2 = $fiber2->start();

// استئناف التنفيذ$result1 = $fiber1->resume();$result2 = $fiber2->resume();

echo "النتيجة 1: " . $result1 . "";echo "النتيجة 2: " . $result2 . "";?>


2. العمل غير المتزامن مع قاعدة البيانات عبر Amp



Amp هي مكتبة قوية للبرمجة غير المتزامنة. لنلقِ نظرة على مثال للاتصال غير المتزامن بـ MySQL:



<?phprequire 'vendor/autoload.php';

use Amp\\Loop;use Amp\\Mysql\\ConnectionConfig;use Amp\\Mysql\\Pool;

Loop::run(function () { $config = ConnectionConfig::fromString( "host=localhost user=root password=secret db=test" ); $pool = new Pool($config); // استعلام غير متزامن - لا يحجب التنفيذ $promise1 = $pool->query("SELECT SLEEP(2)"); $promise2 = $pool->query("SELECT 1 + 1 AS result"); // كلا الاستعلامين يُنفذان بالتوازي $result1 = yield $promise1; $result2 = yield $promise2; foreach ($result2 as $row) { echo "النتيجة: " . $row['result'] . ""; } $pool->close();});?>


3. إنشاء خادم HTTP غير متزامن على ReactPHP



كامل

المدونات

توصيات الكتب