القلب
(يتطلب إصدار Workerman> = 3.3.0)
bool \ GlobalData\Client::cas(string $key, mixed $old_value, mixed $new_value)
استبدال ذريعة ، يستبدل $new_value
$old_value
.
يمكن فقط كتابة القيمة إذا لم تُعدل قيمة المفتاح هذه من قبل عميل آخر بعد أخذ قيمة آخر مرة.
المعلمات
$key
المفتاح. (على سبيل المثال $global->abc
، abc
هو المفتاح)
$old_value
البيانات القديمة
$new_value
البيانات الجديدة
قيمة العودة
عند النجاح في الاستبدال يتم إرجاع true ، وإلا فإنه يتم إرجاع false.
توضيح:
عند التشغيل المتعدد العمليات في نفس المتغير المشترك ، يجب أحيانًا مراعاة مشكلة التزامن.
على سبيل المثال: عمليتي A و B تضيفان عضوًا واحدًا إلى قائمة المستخدمين في نفس الوقت.
قائمة المستخدمين لعمليتي A و B هي حاليًا $global->user_list = array(1,2,3)
.
تقوم عملية A بتشغيل متغير $global->user_list
، وإضافة مستخدم 4.
تقوم عملية B بتشغيل متغير $global->user_list
وإضافة مستخدم 5.
تقوم عملية A بتعيين المتغير $global->user_list = array(1,2,3,4)
بنجاح.
تقوم عملية B بتعيين المتغير $global->user_list = array(1,2,3,5)
بنجاح.
في هذه الأثناء ، سيؤدي تعيين المتغير بواسطة عملية B إلى استبدال تعيين المتغير بواسطة عملية A وبالتالي فقدان البيانات.
التي تؤدي إلى مشكلة التزامن بسبب أن القراءة والتعيين ليستا عملية أصلية.
لحل مشكلة التزامن هذه ، يمكن استخدام واجهة الاستبدال الذريع.
واجهة الاستبدال الذريع تقوم بفحص القيمة قبل تغيير القيمة بناءً على $old_value
لمعرفة ما إذا تم تغيير هذه القيمة من قبل عملية أخرى أم لا ،
وإذا تم التغيير ، فإنها لن تتم الاستبدال وستعيد false. وإلا ستستبدل وستعيد true.
راجع المثال أدناه.
ملاحظة:
بعض البيانات المشتركة التي تتم تغييرها بشكل متزامن ليست مشكلة ، على سبيل المثال نظام المزايدة الحالي لأعلى عرض ، أو كمية المخزون الحالية لمنتج ما.
مثال
$global = new GlobalData\Client('127.0.0.1:2207');
// قائمة المبادرة
$global->user_list = array(1,2,3);
// يضيف قيمة جديدة إلى user_list بشكل ذريع
do
{
$old_value = $new_value = $global->user_list;
$new_value[] = 4;
}
while(!$global->cas('user_list', $old_value, $new_value));
var_export($global->user_list);