القلب

(يتطلب إصدار 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);