التزامن وتعدد الخيوط في PHP: من النظرية إلى التطبيق

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

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

ابدأ الدورة

التزامن وتعدد الخيوط في PHP: الأساليب الحديثة



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



ما هو التزامن وتعدد الخيوط؟



التزامن هو قدرة البرنامج على تنفيذ مهام متعددة "في وقت واحد" عن طريق التبديل بينها. تعدد الخيوط هو حالة خاصة من التزامن، حيث يتم تنفيذ المهام في خيوط منفصلة لنظام التشغيل.



في PHP قبل الإصدار 7.4، لم يكن هناك دعم أصلي للخيوط. لكن مع ظهور الإضافات pthreads و parallel، وتحسين العمل مع العمليات، تغير الوضع.



1. تعدد الخيوط باستخدام إضافة parallel



إضافة parallel هي طريقة حديثة للعمل مع الخيوط في PHP 7.4+. تستخدم الذاكرة المشتركة، مما يسمح بتبادل البيانات بكفاءة بين الخيوط.



التثبيت:

pecl install parallel


مثال على إنشاء خيط:

<?phpuse parallel\\Runtime;

$runtime = new Runtime();$future = $runtime->run(function() { // عمليات حسابية ثقيلة $result = 0; for ($i = 0; $i < 1000000; $i++) { $result += sqrt($i); } return $result;});

echo "الخيط الرئيسي يواصل العمل...";$result = $future->value(); // الحصول على النتيجةecho "النتيجة: $result";?>


مزايا parallel:

  • دعم أصلي للخيوط بدون تبعيات إضافية
  • ذاكرة مشتركة بين الخيوط
  • إمكانية تمرير closures والكائنات


العيوب:

  • يتطلب PHP 7.4+ و ZTS (Zend Thread Safety)
  • غير مدعوم على Windows
  • صعوبات في التصحيح


2. عدم التزامن عبر العمليات: pcntl_fork



إذا كنت لا تحتاج إلى ذاكرة مشتركة، يمكنك استخدام العمليات عبر pcntl_fork(). هذا هو الأسلوب الكلاسيكي في Unix.



<?php$pid = pcntl_fork();

if ($pid == -1) { die("خطأ في إنشاء العملية");} elseif ($pid) { // العملية الأم echo "الأم: في انتظار العملية الابنة..."; pcntl_wait($status); echo "الأم: العملية الابنة اكتملت";} else { // العملية الابنة echo "الابنة: أقوم بتنفيذ المهمة..."; sleep(3); exit(0);}?>


خصائص العمل مع العمليات:

  • كل عملية لها ذاكرتها الخاصة
  • لتبادل البيانات استخدم sockets أو الذاكرة المشتركة (shmop) أو الملفات
  • يجب معالجة العمليات الزومبي عبر pcntl_wait()


3. التزامن عبر الدوال غير المتزامنة و ReactPHP



لمهام الإدخال/الإخراج (طلبات الشبكة، قراءة الملفات) من الأكثر فعالية استخدام المكتبات غير المتزامنة مثل ReactPHP أو Amp. لا تنشئ هذه المكتبات خيوطًا، لكنها تسمح بتنفيذ المهام بشكل متزامن عبر event loop.



مثال مع ReactPHP:

<?phprequire 'vendor/autoload.php';

use React\\EventLoop\\Factory;use React\\Http\\Browser;

$loop = Factory::create();$client = new Browser($loop);

$promises = [];$urls = [ 'https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3'];

foreach ($urls as $url) { $promises[] = $client->get($url);}

// انتظار جميع الطلبات بالتوازي$results = [];foreach ($promises as $promise) { $results[] = $promise->wait();}

$loop->run();print_r($results);?>

المدونات

توصيات الكتب