<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          YurunLockPHP阻塞鎖和非阻塞鎖機制

          聯(lián)合創(chuàng)作 · 2023-09-28 12:07

          YurunLock

          PHP阻塞鎖和非阻塞鎖機制,內置解決并發(fā)鎖重復執(zhí)行的方案。目前支持文件、Redis、Memcache、Memcached。

          composer安裝

          在你項目中的 composer.json 文件中加入下面的內容

          {
              "require": {
                  "yurunsoft/yurun-lock": "dev-master"
              }
          }

          中國用戶如果使用composer很卡,請查看:https://pkg.phpcomposer.com/

          代碼用法

          文件鎖

          <?php
          $lock = new \Yurun\Until\Lock\File('我是鎖名稱');
          
          $lock->lock(); // 阻塞鎖
          // TODO:在這里做你的一些事情
          $lock->unlock(); // 解鎖
          
          // 帶回調的阻塞鎖,防止并發(fā)鎖處理重復執(zhí)行
          result = $lock->lock(
              function(){
                  // TODO:在這里做你的加鎖后處理的任務
          
              },
              function(){
                  // 判斷是否其它并發(fā)已經(jīng)處理過任務
                  return false;
              }
          );
          switch($result)
          {
              case LockConst::LOCK_RESULT_CONCURRENT_COMPLETE:
                  // 其它請求已處理
                  break;
              case LockConst::LOCK_RESULT_CONCURRENT_UNTREATED:
                  // 在當前請求處理
                  break;
              case LockConst::LOCK_RESULT_FAIL:
                  // 獲取鎖失敗
                  break;
          }
          
          // 不阻塞鎖,獲取鎖失敗就返回false
          if($lock->unblockLock())
          {
              // TODO:在這里做你的一些事情
          }
          else
          {
              // 獲取鎖失敗
          }

          redis/memcache/memcached鎖

          <?php
          $lock = new \Yurun\Until\Lock\Redis(    // 可以把Redis替換成Memcache/Memcached,下面代碼用法相同
              '我是鎖名稱',
              array(
                  'host'      =>  '127.0.0.1',
                  'port'      =>  11211,
                  'timeout'   =>  0,
                  'pconnect'  =>  false,
              ), // 連接配置,留空則為默認值
              0, // 獲得鎖等待超時時間,單位:毫秒,0為不限制,留空則為默認值
              1, // 獲得鎖每次嘗試間隔,單位:毫秒,留空則為默認值
              3, // 鎖超時時間,單位:秒,留空則為默認值
          );
          
          $lock->lock(); // 阻塞鎖
          // TODO:在這里做你的一些事情
          $lock->unlock(); // 解鎖
          
          // 帶回調的阻塞鎖,防止并發(fā)鎖處理重復執(zhí)行
          result = $lock->lock(
              function(){
                  // TODO:在這里做你的加鎖后處理的任務
          
              },
              function(){
                  // 判斷是否其它并發(fā)已經(jīng)處理過任務
                  return false;
              }
          );
          switch($result)
          {
              case LockConst::LOCK_RESULT_CONCURRENT_COMPLETE:
                  // 其它請求已處理
                  break;
              case LockConst::LOCK_RESULT_CONCURRENT_UNTREATED:
                  // 在當前請求處理
                  break;
              case LockConst::LOCK_RESULT_FAIL:
                  // 獲取鎖失敗
                  break;
          }
          
          // 不阻塞鎖,獲取鎖失敗就返回false
          if($lock->unblockLock())
          {
              // TODO:在這里做你的一些事情
          }
          else
          {
              // 獲取鎖失敗
          }

          直接傳入操作對象

          直接傳入操作對象支持文件、redis、memcache、memcached。可以防止重復實例化對象,造成內存和網(wǎng)絡負擔。

          // 文件
          $fp = fopen('1.txt', 'w+');
          $lock = new \Yurun\Until\Lock\File('我是鎖名稱', $fp);
          $lock->lock();
          // 做一些事情
          $lock->unlock();
          fclose($fp);
          
          // redis、memcache、memcached同理
          $redis = new \Redis;
          $redis->connect($host, $port, $timeout);
          $lock = new \Yurun\Until\Lock\Redis('我是鎖名稱', $$redis);
          $lock->lock();
          // 做一些事情
          $lock->unlock();
          redis->close();
          瀏覽 22
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91久久超碰| 先锋资源久久 | 五月婷婷激情在线 | 成人免费无码激情AV片 | 国产色无码网站www色视频 |