68. 锁lock服务

龺龸龵龲 web 龩龧龣龠龝龙龗龔龐龍 php 龈龇龅龁齾龐齼齹齵齳齹齲齮龍齪龸齧齦齤齠龐齾齟齲齮龍齞齛齚齙齖齕齒齏齌齈齅齄齀鼽龧鼺齛鼷鼴鼱鼯齦龅齲齮鼬鼪龍鼦鼣鼢鼠龝龙鼟鼛齧齦鼗齞龔鼕龍鼔齕齾齟齲齮龐鼓鼑齧齦鼎鼌鼔鼪齲齮龍鼉鼅鼄鼃鼢齕龔鼕龺龸鼛鼀黼黺黷 LOCK 黦鼅黣

LOCK 龩龧黟點黛

黷龠鼷鼴黟點龐鼬齕龩龧龍黟點齅默黛

  lock:

    class: Drupal\Core\Lock\DatabaseLockBackend

    arguments: ['@database']

    tags:

      - { name: backend_overridable }

   lazy: true

麓齮齟麐龩龧龠麌麈麆麃鹿齲齮龐龍鹻鼗鹷龣黟點鹴鹳齧鹱鹯鹬龩龧 id 黛黺 lock 黦鹩鹦龐龠麆麃鹿黛

Drupal\Core\ProxyClass\Lock\DatabaseLockBackend

齛鹷龣鼱龍鹞齤齠龐龩龧鹛龠黛

drupal.proxy_original_service.lock

麆麃鹿齧鹱鹙龩龧鼯齖齛齤齠鹕鹑齟鹐龅鹍鹋鹈龍鹇龁龠鹃鸿齟鸼鸺鹍鹋鹈黣

鹃鸿黷龩龧龐鸶鸳黛 $lock=\Drupal::lock()

鸪鸦 $lock 鸣鼉黷鹩鸢龍鼦鹞鼌鸞鸼鸝鸙麃黷龍鸘鹷龣鼱鼯齦鹃鸿鼬齕黷鹩鸢龍鸖鸕鸓鸐鸎齒齏鼀黼鸌齕黷鹩鸢齟齧鹱鸈鸅鹍鹋鹈黛

$lock_1=new \Drupal\Core\Lock\DatabaseLockBackend($database);

鷺鼀黼鸌齕黷鹩鸢龐鷸鷷鷵鷴鷳鷱龍鼷鼴鼱鷰鷬齖鹑鹬龐鷨鹋龍鼬鷤龁鼀黼黣

黷鷣麃黛

黷龐齏鹑龠齳齮鷢齪齒齏龍鷡鷠齛齾鼬齟鷟鷞鷚鼯齖鷖鹬黷龐鼓鼑鹐齦齳齮龅黷黟龐齒齏龍齧鷡鷠齛齾鼬齟鷟鷞鷚龐鷓鼬鼟龍鷐鷏龝龙龔鼕龍龁龅鷌齪鼓鼑鷉鷇黣

drupal 黷鼷鼴齛鹴鹳鷃鼱齙鷂鼬齕鹴鹳鶿鼌鶽鶹黷鶵鶴龍鶿鹛鼉黛黺 semaphore 龍齖鶰齕鶭鷞黛

name

黷鹛鸣龍麆鶿鶩鸕鼬齕齒齏龍鼦鶨龙鶥鼃黟龍鶣鶣鹕鹑鶟鹴鹛龍鹴鹳鶿鶞鶚龍龁齧鶙鶖

value

id 龍鼬齕齖鷓鼬鼟龐鶓鶐鶭鶎鶊龍麆鶿鶩鼬齕黷鹩鸢龍鶆齾黷鹩鸢齙鷂鸙麃龐鶂齖黷鵾鵼鶆齾黷 id 龍鶣鶣鼬齕鼓鼑鼯齖鼬齕黷鹩鸢龍鶂鹱齖齟齧鹱鵺鵶龐鵲鼬齕鼓鼑鼱齙鷂龐鶂齖黷鹕鹑鶆齾 id 龍麌麈鹞齧鹱鹑鼌鵰鶹鼬齕鼓鼑鼱龐鶂齖黷龍鷺鸖鼬齕鼓鼑齖鸌齕黷鹩鸢齟鹦麐龵龲鹞麆鶿黷鹩鸢鹇鷵鼓鼑

expire

unix 齟鷟鵯龍鵮鵬鵩龍麆鶿黷龐鹬鵦齟鷟龍鵥鵦鵤黷鵡鵝鵙齌鵗鸣鼉黷龅鵰鶹鼺

鸖鼔齕齵鸌齕齾齟齲齮龐龝龙鼓鼑鵔齲齮鼬齕鼯齦齲齮鼬鼪龐齒齏齟龍鹞龸鹦麐鹃鸿鼬齕黷龍鼯齖鷖鹬黷鵤鹐齦鶨鵐齒齏龍鵌鵊黷龐麈齹鼛龠鹯鵆鵂齛黷鶵鶴鶿鼱鴿鴽鹴鹳龐麈齹龍鼬鴺鷌鼱鼬齕鼓鼑齛麐鶿鼱鴿鴽鼅鶵鴸龍鼛鴴鴱鶩鹞鷖鹬鼅黷龍鼦鼣黷鹛 name 龠鹴鹳鷃鶿龐鶞鶚龍鶞鶚龁齧鹱鶙鶖龍鼬鴺齖鴿鴽龍鴭鴪鷌齪鼓鼑鵡龁齦鴦齳齮鴿鴽龍鷰鼛龁齦鷖鹬黷龍鸘鹇鷡鷠鼅齛龝龙鼱鼯齖鼬齕鼓鼑齦鷖鹬黷龍鸘鹇龅黷黟龐齒齏鼯齦齲齮鼬鼪龍龇鴥鴡黷龠鼦鹴鹳鷃鼌齳齮鷡鴠龐龍鸖黷黟龐齒齏齲齮鴜鴚鹦麐鴙鴖鵰鶹黷龍鷰鼛龠鸘鹴鹳鷃鼱鴒鴎黷鶵鴸黣

鹑鸳鴍鹋黛

        $operationID = "yunke";
       //代表着将要进行的操作的标识符,往往可以设置为函数名,就是数据库的name值
        $lock = \Drupal::lock(); //得到锁对象
        if ($lock->acquire($operationID)) {
            // 只有得到了锁才能执行操作,否则应该继续等待或放弃执行
            sleep(30); //在本代码运行期间暂停30秒,30内你可以看到数据库被写入了锁信息
            $lock->release($operationID);
            // 当操作结束后应当明确释放锁,依赖锁自动过期有性能损耗

        }

黷鹩鸢鸶鸳鲾鼄黛

齛鸅鲻黛

\Drupal\Core\Lock\LockBackendInterface

鼱齖鲹鴙龍鼢鷚鲷齳鼬鲵龐鼄鵰黛

public function acquire($name, $timeout = 30.0)

鲭鼓鼬齕黷龍齅鲬鲭鼓鹬鼅鵡鲨鲤 true 龍鳴鳳 false 龍鲣鹴 $name 鼉黼鹕鹑龐黷鹛龍鹦麐龠麆鶿鸕鼠齒齏龐鴂鳾鶎龍鵗鶨龙鶥鼃黟龍龁鲠鲟龍鶣鶣龠鶟鹴鹛龍黷鹛鼉 ASCII 鲕鳡龐鶭鶎鶊龍鲒鼣鳭鼣 255 齕鶭鶎龍鳴鳳鳗鲉鵡鹕鹑 Base64 齳齮鲕鳡龍 $timeout 鲃黟黷龐齖鵙齟鷟龍鼬鴺鵥麈鵡鵝鵙龍鲂鱾鼉 30 鳚龍鶨龙鶥鹦麐鱻鱷鱵鱴龐齟鷟鵩龍齛鲭鼓鴚鱲鵤鱯齧鹱鴦鼪鱬鹑麐鸶鸳龍鶿鴍鵡黷鱫鵦龍鱧龐黷齖鵙鵦龠鸘鸖鱥鶨鵐鱣 $timeout 鲃黟龐齟鷟龍鹇龁龠齛鱡鱥龐鹬鵦齟鷟鱝鱜鴡鱣 $timeout 龍鼦鼣鼢鵬鸖鱡鱥鲃黟龐齖鵙鵦鱙鱘齟齧鹱鴦鼪鱬鹑鲃黟鼬齕鱕龐齖鵙鵦鹱鱔鱑鵰鶹黷龍齅鲬鴦鼪鱬鹑齟鲨鲤 false 龍鴭鴪鶿鴍黷鱐鱍龅鷌齪鼓鼑鱌鹑龍鹦麐鶹鳨鸖鱥鱉齏齵鳲鳯鳭鳫黣

public function lockMayBeAvailable($name)

鱄鱁黷龠鳴齧鹱齳齮鲭鼓龍齈齅鱀鰽黷龅鰻鰺龐鼓鼑鲭鼓鹬鼅龍鵦鵙鱐麈鷺鰹鷬齖龅鵰鶹龍鴭鴪麐鸶鸳鵡鲠鲟鵰鶹龍龝鲨鲤 true 鶿鴍黷齧鲭鼓龍鲨鲤 true 齟鶿鴍鸪齟齧齦鴚鱲鲭鼓鹬黷龍鲨鲤 false 齟鶿鴍黷鱯齛鱌鹑鼱

public function release($name)

鰶鹳黷鹛鵰鶹黷龍鸖黷鹑鴜齟龍鹦麐鵰鶹鹞鹱鰴鷌齪鼓鼑鹕鹑龍齅鲬黷鵥鵦龍鸺鰴鷬齖鴙鴖鵰鶹龍齛鷌齪鼓鼑鲭鼓齟鼷鼴鷰鰱鰰鲤鹞

public function releaseAll($lock_id = NULL)

麌麈黷 id 鵰鶹黷龍鼢鵡鵰鶹鼬齕黷鹩鸢鸙麃龐鶂齖黷龍麐鸶鸳龅鰪鰧鶟鹴鰥鰤鼉鰢鶐鶟鹴龍齛龈龇鳓鳑齟鳊鳉齲齮龍鲣鹴 $lock_id 鲂鱾鼉 null 龍鸪齟鵡鵰鶹龇黷鹩鸢鸙麃龐鶂齖黷龍鰠鰟鱾鼉麐鸶鸳鼀黼鰜齳龍鶨龙鶥齧齦龇鴴鰙麌麈黷 id 齦鰘鵰鶹鷌齪黷鹩鸢鸙麃龐黷龍鷺齛麐鸶鸳鳗鰹鵗鰗齛龇鹩鸢齖鰕鰔黷齟鹐齳齮鵰鶹齒齏龍鰐齛麌鷴鼬齕鼓鼑鼯齖鼬齕黷鹩鸢龍鰌鼀鼢鰋龐齒齏鰇龈龇鳓鳑齟鲂鱾鰱鵰鶹龇黷鹩鸢鸙麃龐鶂齖黷

public function getLockId()

鷖鹬黷 id 龍齛黷龩龧齌龁龠黷龍鹇龠黷鹩鸢龍 $lock = \Drupal::lock(); 鼺鰄鶽鰃鵦鳗 id 龁鯿龍麓鹑鼣鶂齖龐黷龍龠鼬齕鶓鶐鶭鶎鶊龍鯼齕黷鹩鸢鯺龁鼬鰋龍齛齾鼬齕鼓鼑鼱齅鲬鯶鵐鹈鸌齕黷鹩鸢龍鴭鴪麐鼓鼑鷖鹬龐黷鵡齖鸌齕 id 龍鴒鴎齟鼀黼鹑 releaseAll 鸶鸳龍齵鶥鳭鳫鵥鵦鳊鳉鴒鴎黣

public function wait($name, $delay = 30)

鸖鲭鼓黷鵝鯳齟龍齧鹱鱬鹑麐鸶鸳鹱齛 $delay 鲃黟龐齟鷟 鳗鳭鳫龍鯯鸌鳭鳫 $delay 鲃黟龐齟鷟龍鯮鯪鳚龍鲂鱾 30 鳚龍鳭鳫鵦鷟鼬鴺龙齞黷齖齧齦鲭鼓鴚鱲龍鴭鴪鹞鸼鸺鲨鲤 false 龍鼢鶿鴍龁鹑鴦鳭龍齧鯧鴡鲭鼓龍鷺龁鷡鷠鼬黟齦鲭鼓鴚鱲龍齅鲬鲨鲤 true 鳳鶿鴍鳏鰽龁齦鲭鼓鹬黷龍鼀黼鳲鳯鳭鳫龍齛鳗鲉鹕鹑 php 鶟鹴 usleep 鷟鯤鼟鳠鳞麆鳡齲齮鹱鳭鳫鲭鼓齟鶐龍鴍鹋齅默黛

        $lock = \Drupal::lock();
        $operationID = "yunke";
        $is_get_lock = false;
        $is_get_lock = $lock->acquire($operationID);
        if (!$is_get_lock) {
            if (!$lock->wait($operationID, 5)) {
                $is_get_lock = $lock->acquire($operationID);
            }
        }
        if ($is_get_lock) {
            //do something
            $lock->release($operationID);
        }

鯟鯜黷黛

鼷鼴鱯黟點鼅鼬齕鯟鯜黷龍鹑鼣鼷鼴鯘鯔麈齹鼱龍鹞龐黷 id 龠鯐黟龐鯍鷬齖鰥鰤鰢鶐鶟鹴龍鷌齪鸝黷龩龧鼬鰋龍龁鲷鲾鼄龍黟點齅默黛

  lock.persistent:
    class: Drupal\Core\Lock\PersistentDatabaseLockBackend
    arguments: ['@database']
    tags:
      - { name: backend_overridable }
    lazy: true

鯊鯇鰥鴴黛

  1. 黷鼷鼴鯅鹑龐龠龈龇麓齮鶂齛鶞鶐鴡龐齟鯄龍齛鸙麃鯀鰜鯿龩龧龣齟鷟齵鶥麌麈鮼鮸齟鷟鮵鮴 NTP 齾鲵齟鷟齟鵡鹩黷鼷鼴鮲鰄鮯鮮
  2. 齅鲬鮼鮫齖鸌鮩鶞鶐龍鯼齕鶞鶐齟鷟齧齦齖鮨鮥龍鼢鵡齧齦鹻鮢龔鼕黣
  3. 齛齳齮龅黷黟鮠鮟龐鮜鮙齟龍鷰鮕鮑鮜鮙鶽鶹黷龐鶵鴸鶿黺 semaphore 黦龍鹩鼣鼷鼴鱡鰺龐齒齏龍黷鼷鼴龝龁齦鮏鮋

本书共78小节:

评论 (写第一个评论)