CAS

(Workerman versiyonu >=3.3.0 gerektirir)

bool \GlobalData\Client::cas(string $key, mixed $old_value, mixed $new_value)

Atomik olarak eski değeri $old_value ile yeni değer ile değiştirir. Sadece bu anahtarın değeri diğer istemciler tarafından değiştirilmediği durumlarda son istemci tarafından alınan son değerler üzerinde işlem yapılırken değer yazılabilir.

Parameters

$key

Anahtar değer. (Örneğin $global->abc, abc anahtar değeridir)

$old_value

Eski veri

$new_value

Yeni veri

Return Value

Değiştirme başarılı ise true, aksi halde false döner.

Açıklama:

Aynı paylaşılan değişkeni aynı anda çoklu işlemle işlerken, bazen eşzamanlılık sorunu göz önünde bulundurulmalıdır.

Örneğin, A ve B iki süreç aynı kullanıcı listesine bir üye ekleyebilir.
A ve B süreçleri mevcut kullanıcı listesi $global->user_list = array(1,2,3) olabilir.
A süreci $global->user_list değişkenini düzenler ve bir kullanıcı 4'ü ekler.
B süreci $global->user_list değişkenini düzenler ve bir kullanıcı 5 ekler.
A süreci değişkeni $global->user_list = array(1,2,3,4) olarak başarıyla ayarlar.
B süreci değişkeni $global->user_list = array(1,2,3,5) olarak başarıyla ayarlar.
Bu durumda B süreci tarafından ayarlanan değişken, A süreci tarafından ayarlanan değişkeni üzerine yazarak veri kaybına neden olur.

Yukarıdaki durum, okuma ve yazma işlemlerinin atomik olmadığından dolayı eşzamanlılık sorununa neden olur.
Bu tür eşzamanlılık sorunları çözmek için, cas atomik değiştirme arayüzü kullanılabilir.
cas arayüzü bir değeri değiştirmeden önce,
bu değerin $old_value tarafından diğer işlemler tarafından değiştirilip değiştirilmediğine karar verir,
eğer değiştirildiyse değiştirmez false döner. Aksi halde true döner.
Aşağıdaki örneğe bakın.

Not: Birkaç paylaşılan verinin eşzamanlı olarak üzerine yazılması sorun yaratmaz, örneğin müzayede sistemi, mevcut en yüksek teklif veya mevcut ürün stoku gibi.

Örnekler

$global = new GlobalData\Client('127.0.0.1:2207');

// Listeyi başlat
$global->user_list = array(1,2,3);

// user_list'e atomik olarak bir değer ekle
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);