يوضح
1. قائمة انتظار الرسائل هي قائمة انتظار مخزنة في الذاكرة.
2. نظرًا لأن عملية واحدة فقط يمكنها الوصول إلى البيانات الموجودة في قائمة انتظار الرسائل، فلا حاجة إلى أقفال أو إشارات إضافية.
مثال
echo "معرف التقدم الأصلي:{$parentPid}n";$childList = array(); // إنشاء قائمة انتظار الرسائل وتحديد أنواع الرسائل (على غرار المكتبات في قواعد البيانات) $id = ftok(__FILE__,'m'); $msgQueue = msg_get_queue($id); const MSG_TYPE = 1؛ // منتج وظيفة المنتج () { عالمي $msgQueue؛ $pid = posix_getpid(); $repeatNum = 5; من أجل ( $i = 1; $i <= $repeatNum; $i++) { $str = "({$pid})إنشاء التقدم! {$i}"; msg_send($msgQueue,MSG_TYPE,$str); $راند = راند(1,3); النوم($راند); } } // وظيفة المستهلك المستهلك () { عالمي $msgQueue؛ $pid = posix_getpid(); $repeatNum = 6; من أجل ( $i = 1; $i <= $repeatNum; $i++) { $rel = msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$message); صدى "{$message} | المستهلك({$pid}) يدمر n"; $راند = راند(1,3); النوم($راند); } } وظيفة createProgress($callback){ $pid = pcntl_fork(); إذا ($pid == -1) { // فشل الإنشاء Exit("خطأ في تقدم الشوكة!n"); } وإلا إذا ($pid == 0) { // برنامج تنفيذ العمليات الفرعية $pid = posix_getpid(); $رد الاتصال(); خروج("({$pid})نهاية تقدم الطفل!n"); }آخر{ // العملية الأصلية تنفذ البرنامج return $pid; } } // 3 عمليات كتابة لـ ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('producer'); $childList[$pid] = 1; echo "إنشاء تقدم فرعي للمنتج: {$pid} n"; } // عمليتان للكتابة لـ ($i = 0; $i < 2; $i ++ ) { $pid = createProgress('consumer'); $childList[$pid] = 1; echo "إنشاء تقدم فرعي للمستهلك: {$pid} n"; } // انتظر حتى تنتهي جميع العمليات الفرعية while(!empty($childList)){ $childPid = pcntl_wait($status); إذا ($childPid > 0){ unset($childList[$childPid]); } } echo "({$parentPid})نهاية التقدم الرئيسي!n";
ما ورد أعلاه هو مقدمة لقائمة انتظار رسائل PHP وآمل أن يكون مفيدًا للجميع.