Rumah > Soal Jawab > teks badan
Apakah prinsip menambah kunci memori pada acara loteri PHP?
fungsi awam memperoleh($key) {
//Jika anda perlu memperoleh dua kunci pada masa yang sama
if ( is_array($key) && count($key) == 2 ) {
manakala (BENAR) {
$res = array();
foreach($kunci sebagai $k => $v) {
$res[$k] = $this->acquire($v);
jika ( !$res[$k] ) {
pecah;
}
}
//Jika kunci pertama tidak diperoleh, kembalikan terus
jika ( !$res[0] ) {
$err = SysErr baharu(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
ErrorHandle::throwErr($err);
} elseif( !$res[1] ) {
//Lepaskan kunci pertama, tunggu dan cuba lagi
$this->release($key[0]);
usleep(LockConfig::LOCK_TIMEWAIT);
} lain {
kembalikan BENAR;
}
}
} lain {
$lock_key = LockConfig::LOCK_PREFIX .
$i = 0;
buat {
$lock = $this->_memcache->add( $lock_key, 1, LockConfig::LOCK_TIMEOUT );
//Jika kunci tidak diperoleh buat kali pertama, tunggu masa yang ditentukan dan cuba lagi.
jika ($i > 0) {
usleep(LockConfig::LOCK_TIMEWAIT);
}
$i++;
//Keluar selepas melebihi bilangan percubaan semula
jika ($i > LockConfig::LOCK_RETRY_TIMES) {
$err = SysErr baharu(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
ErrorHandle::throwErr($err);
}
} while( !$lock );
// log rekod
jika ($i > 1) {
LogHelper::warning('lock.log', "Peroleh kunci '{$lock_key}' untuk {$i} kali");
}
pulangkan $lock;
}
}
/**
* Lepaskan kunci ingatan
*
* @param string $key Nilai kekunci selepas mengalih keluar awalan kunci memori
* @return bool Mengembalikan TRUE jika berjaya dikeluarkan
*/
keluaran fungsi awam($key) {
$lock_key = LockConfig::LOCK_PREFIX .
kembalikan $this->_memcache->delete($lock_key);
}
为情所困2017-05-16 13:11:23
Anda tidak memerlukan kunci memori untuk loteri. Anda boleh menggunakan baris gilir atau transaksi Redis dan menambah kunci Mysql. .
Saya tidak tahu sama ada kunci memori yang anda mahukan ialah ini:
$kunci = new CacheLock('key_name');
$lock->lock(); );
Kunci proses CacheLock digunakan terutamanya untuk pemerolehan cache satu proses apabila cache gagal menghalang permintaan SQL yang berlebihan daripada menembusi pangkalan data Ia digunakan untuk menyelesaikan kawalan kunci PHP semasa konkurensi dan melakukan penguncian antara proses melalui fail /eaccelerator Jika tidak Gunakan eccelerator untuk memproses kunci fail, dan hasilkan kunci dengan butiran yang sepadan dalam direktori yang sepadan, pemprosesan dilakukan dalam ingatan, dan prestasinya agak tinggi. Kunci berbeza dilaksanakan secara selari -kunci peringkat mysql innodb.