مقدمة: لماذا يحتاج مطور PHP إلى التفكير في البرمجة المتزامنة؟
\n\nكان يُعتقد سابقًا أن PHP هي لغة "للنصوص البرمجية السريعة" حيث يتم تنفيذ كل شيء بشكل تسلسلي، ولا حاجة لأي عمل متوازٍ جاد. لقد تغيرت الأوقات. اليوم نبني باستخدام PHP واجهات برمجة تطبيقات عالية التحميل، وقوائم انتظار المهام، وWebSockets، وحتى الخدمات المصغرة. وهنا يطرح السؤال: كيف نجعل PHP يقوم بعدة مهام في وقت واحد دون حظر كل شيء؟
\n\nفي هذه المقالة، سنستعرض ثلاثة أساليب لـ البرمجة المتزامنة في PHP: الخيوط التقليدية (pthreads)، الجوروتينات الخفيفة (Fiber)، والصياغة الحديثة async/await. سترى أمثلة حقيقية للكود، وستعرف أين تستخدم كل أداة، وما الذي يجب اختياره في عام 2025.
\n\nإذا كنت تبحث عن التنفيذ المتوازي في PHP لمعالجة البيانات، أو تريد فهم كيف تختلف جوروتينات PHP عن الخيوط، فأنت في المكان الصحيح.
\n\n1. تعدد الخيوط في PHP: pthreads — قديم لكنه قوي
\n\nما هو وكيف يعمل؟
\npthreads هو إضافة تمنح PHP القدرة على إنشاء خيوط نظام تشغيل حقيقية. كل خيط هو نسخة منفصلة من محرك Zend بذاكرته الخاصة، ولكن مع إمكانية تبادل البيانات عبر كائنات Threaded.
ملاحظة مهمة: يعمل pthreads فقط في وضع CLI ولا يُدعم في بيئة الويب (Apache/Nginx mod_php). لكنها الطريقة الوحيدة للحصول على توازٍ حقيقي (وليس مجرد تزامن) على مستوى المعالج.
\n\nمثال: تحليل عناوين URL بشكل متوازٍ
\n<?php\n// تأكد من تثبيت إضافة pthreads\nclass UrlFetcher extends Thread {\n private $url;\n private $result;\n\n public function __construct(string $url) {\n $this->url = $url;\n }\n\n public function run() {\n // يتم التنفيذ في خيط منفصل\n $this->result = file_get_contents($this->url);\n }\n\n public function getResult() {\n return $this->result;\n }\n}\n\n$urls = ['https://api.example.com/1', 'https://api.example.com/2', 'https://api.example.com/3'];\n$threads = [];\n\nforeach ($urls as $url) {\n $thread = new UrlFetcher($url);\n $thread->start(); // تشغيل الخيط\n $threads[] = $thread;\n}\n\n// جمع النتائج\nforeach ($threads as $thread) {\n $thread->join(); // انتظار الانتهاء\n echo $thread->getResult() . PHP_EOL;\n}\n?>\n\nيقوم الكود بتشغيل ثلاثة خيوط، كل منها يحمل عنوان URL الخاص به. وقت التنفيذ يساوي تقريبًا وقت أبطأ طلب، وليس مجموع الثلاثة. توضيح ممتاز لـ التنفيذ المتوازي في PHP.
\n\nمتى تستخدم pthreads؟
\n- \n
- مهام CPU الثقيلة (معالجة الصور، التشفير، إنشاء PDF). \n
- تحليل كميات كبيرة من البيانات في نصوص CLI. \n
- عند الحاجة إلى توازٍ حقيقي وليس تعدد مهام تعاوني. \n
2. الجوروتينات في PHP: Fiber — خفة وتحكم
\n\nما هو Fiber؟
\nبدءًا من PHP 8.1، ظهرت Fiber في اللغة — وهي مشابهة للجوروتينات في Go أو الكوروتينات في Python. على عكس الخيوط، لا ينشئ Fiber عملية نظام تشغيل منفصلة. إنها وحدة تنفيذ خفيفة تعمل في خيط واحد وتتبدل بناءً على أمر المطور.
\n\nالفكرة الأساسية: أنت من يقرر متى توقف Fiber الحالي وتنقل التحكم إلى آخر. يُسمى هذا تعدد المهام التعاوني. مثالي لعمليات الإدخال/الإخراج (طلبات API، قراءة الملفات، العمل مع قاعدة البيانات).
\n\nمثال: تجوال غير متزامن في المجلدات
\n<?php\nfunction readFileAsync(string $path): Fiber {\n return new Fiber(function () use ($path) {\n $handle = fopen($path, 'r');\n $content = '';\n while (!feof($handle)) {\n $chunk = fread($handle, 4096);\n $content .= $chunk;\n // إيقاف Fiber لإعطاء فرصة لـ