التزامن وتعدد الخيوط في PHP: المستوى المتقدم

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

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

ابدأ الدورة

التزامن وتعدد الخيوط في PHP: المستوى المتقدم



يرتبط PHP تقليديًا بالتنفيذ المتزامن للنصوص البرمجية، لكن تطبيقات الويب الحديثة تتطلب معالجة مهام متعددة في وقت واحد. يسمح التزامن (concurrency) وتعدد الخيوط (multithreading) بزيادة الأداء بشكل كبير، وتسريع معالجة الطلبات، واستخدام موارد الخادم بكفاءة. في هذه المقالة، سنستعرض التقنيات المتقدمة للعمل مع تعدد الخيوط في PHP، بما في ذلك إضافة pthreads، والعمليات المتوازية، والاستدعاءات غير المتزامنة، وإدارة الخيوط.



1. أساسيات تعدد الخيوط في PHP: إضافة pthreads



إضافة pthreads هي الأداة الرئيسية للعمل مع الخيوط في PHP. تسمح بإنشاء وتشغيل ومزامنة عدة خيوط تنفيذ ضمن عملية واحدة. مهم: تعمل pthreads فقط في وضع CLI وتتطلب بناء PHP مع دعم الخيوط (ZTS — Zend Thread Safety).



مثال لإنشاء خيط بسيط:



<?phpclass WorkerThread extends Thread {    private $id;        public function __construct($id) {        $this->id = $id;    }        public function run() {        echo "تم تشغيل الخيط {$this->id}";        sleep(2);        echo "تم إنهاء الخيط {$this->id}";    }}

$threads = [];for ($i = 1; $i <= 5; $i++) { $threads[$i] = new WorkerThread($i); $threads[$i]->start();}

foreach ($threads as $thread) { $thread->join();}?>


الطريقة start() تشغل الخيط، بينما join() تنتظر اكتماله. بدون join()، قد ينتهي الخيط الرئيسي قبل الخيوط الفرعية.



2. مزامنة الخيوط والموارد المشتركة



عند العمل مع تعدد الخيوط، من المهم جدًا مزامنة الوصول إلى البيانات المشتركة. توفر PHP عدة آليات: كائنات Mutex و Volatile و Threaded.



Mutex (الاستبعاد المتبادل) — يقفل الوصول إلى المورد للخيوط الأخرى بينما يعمل خيط واحد عليه.



<?phpclass Counter extends Threaded {    private $count = 0;        public function increment() {        $this->synchronized(function() {            $this->count++;        });    }        public function getCount() {        return $this->count;    }}

class IncrementThread extends Thread { private $counter; public function __construct(Counter $counter) { $this->counter = $counter; } public function run() { for ($i = 0; $i < 1000; $i++) { $this->counter->increment(); } }}

$counter = new Counter();$threads = [];

for ($i = 0; $i < 10; $i++) { $threads[$i] = new IncrementThread($counter); $threads[$i]->start();}

foreach ($threads as $thread) { $thread->join();}

echo "القيمة النهائية: " . $counter->getCount(); // 10000?>


Volatile — يضمن أن تكون تغييرات المتغير مرئية لجميع الخيوط. استخدم Volatile لأنواع البيانات البسيطة.



$sharedFlag = new Volatile();$sharedFlag->flag = false;

// في خيط واحد$sharedFlag->flag = true;

// في خيط آخرif ($sharedFlag->flag) { echo "تم تعيين العلامة";}


3. العمليات المتوازية والمهام غير المتزامنة



إذا كانت إضافة pthreads غير متوفرة (على سبيل المثال، في استضافة مشتركة)، يمكن استخدام العمليات المتوازية عبر pcntl_fork() أو المكتبات غير المتزامنة مثل ReactPHP أو Amp.



pcntl_fork() — تنشئ عملية فرعية يتم تنفيذها بالتوازي مع العملية الأم.



<?php$pid = pcntl_fork();if ($pid == -1) {    die("فشل إنشاء العملية");} elseif ($pid)                

المدونات

توصيات الكتب