Heim  >  Artikel  >  PHP-Framework  >  So verwenden Sie Mutex yii

So verwenden Sie Mutex yii

藏色散人
藏色散人Original
2020-02-03 10:19:082910Durchsuche

So verwenden Sie Mutex yii

Wie verwende ich Mutex yii? Mutex der Yii-Quellcodeanalyse

Mutex-Komponente ermöglicht die gegenseitige Ausführung gleichzeitiger Prozesse, um „Race Conditions“ zu verhindern. Dies wird durch die Verwendung eines „Verriegelungs“-Mechanismus erreicht. Jeder potenziell gleichzeitige Thread kooperiert, indem er eine Sperre erwirbt, bevor er auf die entsprechenden Daten zugreift.

Verwandte Empfehlungen: yii-Tutorial

Verwendungsbeispiel:

if ($mutex->acquire($mutexName)) {
    // business logic execution
} else {
    // execution is blocked!
}

Dies ist eine Basisklasse und sollte erweitert werden, um den eigentlichen Sperrmechanismus zu implementieren.

Werfen wir einen Blick auf die Quellcode-Implementierung:

<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */
 
namespace yii\mutex;
 
use yii\base\Component;
 
/**
 * The Mutex component allows mutual execution of concurrent processes in order to prevent "race conditions".
 *
 * This is achieved by using a "lock" mechanism. Each possibly concurrent thread cooperates by acquiring
 * a lock before accessing the corresponding data.
 *
 * Usage example:
 *
 * ```
 * if ($mutex->acquire($mutexName)) {
 *     // business logic execution
 * } else {
 *     // execution is blocked!
 * }
 * ```
 *
 * This is a base class, which should be extended in order to implement the actual lock mechanism.
 *
 * @author resurtm <resurtm@gmail.com>
 * @since 2.0
 */
abstract class Mutex extends Component
{
    /**
     * @var bool whether all locks acquired in this process (i.e. local locks) must be released automatically
     * before finishing script execution. Defaults to true. Setting this property to true means that all locks
     * acquired in this process must be released (regardless of errors or exceptions).
     */
    public $autoRelease = true;//是否自动释放锁
 
    /**
     * @var string[] names of the locks acquired by the current PHP process.
     */
    private $_locks = [];//当前进程拥有的锁信息
 
 
    /**
     * 初始化Mutex组件
     */
    public function init()
    {
        if ($this->autoRelease) {//如果是自动释放锁
            $locks = &$this->_locks;
            //注册shutdown回调函数,在这里做锁的释放动作
            register_shutdown_function(function () use (&$locks) {
                foreach ($locks as $lock) {
                    $this->release($lock);
                }
            });
        }
    }
 
    /**
     * Acquires a lock by name.
     * @param string $name of the lock to be acquired. Must be unique.
     * @param int $timeout time (in seconds) to wait for lock to be released. Defaults to zero meaning that method will return
     * false immediately in case lock was already acquired.
     * @return bool lock acquiring result.
     */
    public function acquire($name, $timeout = 0)//按名称获取锁
    {
        if ($this->acquireLock($name, $timeout)) {
            $this->_locks[] = $name;
 
            return true;
        }
 
        return false;
    }
 
    /**
     * Releases acquired lock. This method will return false in case the lock was not found.
     * @param string $name of the lock to be released. This lock must already exist.
     * @return bool lock release result: false in case named lock was not found..
     */
    public function release($name)//按名称释放锁
    {
        if ($this->releaseLock($name)) {
            $index = array_search($name, $this->_locks);
            if ($index !== false) {
                unset($this->_locks[$index]);
            }
 
            return true;
        }
 
        return false;
    }
 
    /**
     * This method should be extended by a concrete Mutex implementations. Acquires lock by name.
     * @param string $name of the lock to be acquired.
     * @param int $timeout time (in seconds) to wait for the lock to be released.
     * @return bool acquiring result.
     */
    abstract protected function acquireLock($name, $timeout = 0);//抽象函数,按名称获取锁
 
    /**
     * This method should be extended by a concrete Mutex implementations. Releases lock by given name.
     * @param string $name of the lock to be released.
     * @return bool release result.
     */
    abstract protected function releaseLock($name);//抽象函数,按名称释放锁
}

Als Basisklasse müssen Unterklassen die Methoden „acquireLock“ und „releaseLock“ implementieren, also spezifische Strategien zum Sperren und Entsperren.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Mutex yii. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn