123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- <?php
- namespace yii\mutex;
- use yii\base\InvalidConfigException;
- use yii\db\Expression;
- class MysqlMutex extends DbMutex
- {
-
- public $keyPrefix = null;
-
- public function init()
- {
- parent::init();
- if ($this->db->driverName !== 'mysql') {
- throw new InvalidConfigException('In order to use MysqlMutex connection must be configured to use MySQL database.');
- }
- if ($this->keyPrefix === null) {
- $this->keyPrefix = new Expression('DATABASE()');
- }
- }
-
- protected function acquireLock($name, $timeout = 0)
- {
- return $this->db->useMaster(function ($db) use ($name, $timeout) {
-
- $nameData = $this->prepareName();
- return (bool)$db->createCommand(
- 'SELECT GET_LOCK(' . $nameData[0] . ', :timeout), :prefix',
- array_merge(
- [':name' => $this->hashLockName($name), ':timeout' => $timeout, ':prefix' => $this->keyPrefix],
- $nameData[1]
- )
- )->queryScalar();
- });
- }
-
- protected function releaseLock($name)
- {
- return $this->db->useMaster(function ($db) use ($name) {
-
- $nameData = $this->prepareName();
- return (bool)$db->createCommand(
- 'SELECT RELEASE_LOCK(' . $nameData[0] . '), :prefix',
- array_merge(
- [':name' => $this->hashLockName($name), ':prefix' => $this->keyPrefix],
- $nameData[1]
- )
- )->queryScalar();
- });
- }
-
- protected function prepareName()
- {
- $params = [];
- $expression = 'SUBSTRING(CONCAT(:prefix, :name), 1, 64)';
- if ($this->keyPrefix instanceof Expression) {
- $expression = strtr($expression, [':prefix' => $this->keyPrefix->expression]);
- $params = $this->keyPrefix->params;
- }
- return [$expression, $params];
- }
-
- protected function hashLockName($name)
- {
- return sha1($name);
- }
- }
|