يوضح
1. الإشارة: هي عملية ذرية يوفرها النظام ولا يمكن تشغيل كمية الإشارة إلا بعملية واحدة في نفس الوقت.
تحصل العملية على إشارة ويجب تحريرها بواسطة العملية.
2. الذاكرة المشتركة: هي منطقة الذاكرة العامة التي يفتحها النظام في الذاكرة ويمكن الوصول إليها بأي عملية.
في الوقت نفسه، يمكن لعمليات متعددة الوصول إلى هذه المنطقة لضمان اتساق البيانات، يجب قفل منطقة الذاكرة هذه أو الإشارة إليها.
مثال
echo "معرف التقدم الأصلي:{$parentPid}n"; $childList = array(); // إنشاء ذاكرة مشتركة وإنشاء إشارة وتحديد المفتاح المشترك $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $signal = sem_get($sem_id); ثابت SHARE_KEY = 1؛ // منتج وظيفة المنتج () { حصة الذاكرة العالمية $؛ إشارة $ العالمية؛ $pid = posix_getpid(); $repeatNum = 5; من أجل ( $i = 1; $i <= $repeatNum; $i++) { // الحصول على الإشارة sem_acquire($signal); إذا (shm_has_var($shareMemory,SHARE_KEY)){ // إذا كانت هناك قيمة، أضف واحدة $count = shm_get_var($shareMemory,SHARE_KEY); $count++; shm_put_var($shareMemory,SHARE_KEY,$count); صدى "({$pid}) count: {$count}n"; }آخر{ // لا قيمة، التهيئة shm_put_var($shareMemory,SHARE_KEY,0); صدى "({$pid}) count: 0n"; } // حرر بعد الاستخدام sem_release($signal); $راند = راند(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"; } // انتظر حتى تنتهي جميع العمليات الفرعية while(!empty($childList)){ $childPid = pcntl_wait($status); إذا ($childPid > 0){ unset($childList[$childPid]); } } // حرر الذاكرة المشتركة والإشارة shm_remove($shareMemory); sem_remove($signal); echo "({$parentPid})نهاية التقدم الرئيسي!n";
ما ورد أعلاه هو مقدمة لإشارات PHP والذاكرة المشتركة وآمل أن يكون مفيدًا للجميع.