当前位置: 首页>>代码示例>>PHP>>正文


PHP BagOStuff::lock方法代码示例

本文整理汇总了PHP中BagOStuff::lock方法的典型用法代码示例。如果您正苦于以下问题:PHP BagOStuff::lock方法的具体用法?PHP BagOStuff::lock怎么用?PHP BagOStuff::lock使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在BagOStuff的用法示例。


在下文中一共展示了BagOStuff::lock方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。

示例1: lock

 public function lock($key, $timeout = 6, $expiry = 6)
 {
     return $this->writeStore->lock($key, $timeout, $expiry);
 }
开发者ID:D66Ha,项目名称:mediawiki,代码行数:4,代码来源:ReplicatedBagOStuff.php

示例2: getServerStates

 protected function getServerStates(array $serverIndexes, $domain)
 {
     $writerIndex = $this->parent->getWriterIndex();
     if (count($serverIndexes) == 1 && reset($serverIndexes) == $writerIndex) {
         # Single server only, just return zero without caching
         return ['lagTimes' => [$writerIndex => 0], 'weightScales' => [$writerIndex => 1.0]];
     }
     $key = $this->getCacheKey($serverIndexes);
     # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
     $ttl = mt_rand(4000000.0, 5000000.0) / 1000000.0;
     # Keep keys around longer as fallbacks
     $staleTTL = 60;
     # (a) Check the local APC cache
     $value = $this->srvCache->get($key);
     if ($value && $value['timestamp'] > microtime(true) - $ttl) {
         $this->replLogger->debug(__METHOD__ . ": got lag times ({$key}) from local cache");
         return $value;
         // cache hit
     }
     $staleValue = $value ?: false;
     # (b) Check the shared cache and backfill APC
     $value = $this->mainCache->get($key);
     if ($value && $value['timestamp'] > microtime(true) - $ttl) {
         $this->srvCache->set($key, $value, $staleTTL);
         $this->replLogger->debug(__METHOD__ . ": got lag times ({$key}) from main cache");
         return $value;
         // cache hit
     }
     $staleValue = $value ?: $staleValue;
     # (c) Cache key missing or expired; regenerate and backfill
     if ($this->mainCache->lock($key, 0, 10)) {
         # Let this process alone update the cache value
         $cache = $this->mainCache;
         /** @noinspection PhpUnusedLocalVariableInspection */
         $unlocker = new ScopedCallback(function () use($cache, $key) {
             $cache->unlock($key);
         });
     } elseif ($staleValue) {
         # Could not acquire lock but an old cache exists, so use it
         return $staleValue;
     }
     $lagTimes = [];
     $weightScales = [];
     $movAveRatio = $this->movingAveRatio;
     foreach ($serverIndexes as $i) {
         if ($i == $this->parent->getWriterIndex()) {
             $lagTimes[$i] = 0;
             // master always has no lag
             $weightScales[$i] = 1.0;
             // nominal weight
             continue;
         }
         $conn = $this->parent->getAnyOpenConnection($i);
         if ($conn) {
             $close = false;
             // already open
         } else {
             $conn = $this->parent->openConnection($i, $domain);
             $close = true;
             // new connection
         }
         $lastWeight = isset($staleValue['weightScales'][$i]) ? $staleValue['weightScales'][$i] : 1.0;
         $coefficient = $this->getWeightScale($i, $conn ?: null);
         $newWeight = $movAveRatio * $coefficient + (1 - $movAveRatio) * $lastWeight;
         // Scale from 10% to 100% of nominal weight
         $weightScales[$i] = max($newWeight, 0.1);
         if (!$conn) {
             $lagTimes[$i] = false;
             $host = $this->parent->getServerName($i);
             $this->replLogger->error(__METHOD__ . ": host {$host} is unreachable");
             continue;
         }
         if ($conn->getLBInfo('is static')) {
             $lagTimes[$i] = 0;
         } else {
             $lagTimes[$i] = $conn->getLag();
             if ($lagTimes[$i] === false) {
                 $host = $this->parent->getServerName($i);
                 $this->replLogger->error(__METHOD__ . ": host {$host} is not replicating?");
             }
         }
         if ($close) {
             # Close the connection to avoid sleeper connections piling up.
             # Note that the caller will pick one of these DBs and reconnect,
             # which is slightly inefficient, but this only matters for the lag
             # time cache miss cache, which is far less common that cache hits.
             $this->parent->closeConnection($conn);
         }
     }
     # Add a timestamp key so we know when it was cached
     $value = ['lagTimes' => $lagTimes, 'weightScales' => $weightScales, 'timestamp' => microtime(true)];
     $this->mainCache->set($key, $value, $staleTTL);
     $this->srvCache->set($key, $value, $staleTTL);
     $this->replLogger->info(__METHOD__ . ": re-calculated lag times ({$key})");
     return $value;
 }
开发者ID:paladox,项目名称:mediawiki,代码行数:96,代码来源:LoadMonitor.php

示例3: getLagTimes

 public function getLagTimes($serverIndexes, $wiki)
 {
     if (count($serverIndexes) == 1 && reset($serverIndexes) == 0) {
         # Single server only, just return zero without caching
         return array(0 => 0);
     }
     $key = $this->getLagTimeCacheKey();
     # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
     $ttl = mt_rand(4000000.0, 5000000.0) / 1000000.0;
     # Keep keys around longer as fallbacks
     $staleTTL = 60;
     # (a) Check the local APC cache
     $value = $this->srvCache->get($key);
     if ($value && $value['timestamp'] > microtime(true) - $ttl) {
         wfDebugLog('replication', __METHOD__ . ": got lag times ({$key}) from local cache");
         return $value['lagTimes'];
         // cache hit
     }
     $staleValue = $value ?: false;
     # (b) Check the shared cache and backfill APC
     $value = $this->mainCache->get($key);
     if ($value && $value['timestamp'] > microtime(true) - $ttl) {
         $this->srvCache->set($key, $value, $staleTTL);
         wfDebugLog('replication', __METHOD__ . ": got lag times ({$key}) from main cache");
         return $value['lagTimes'];
         // cache hit
     }
     $staleValue = $value ?: $staleValue;
     # (c) Cache key missing or expired; regenerate and backfill
     if ($this->mainCache->lock($key, 0, 10)) {
         # Let this process alone update the cache value
         $cache = $this->mainCache;
         /** @noinspection PhpUnusedLocalVariableInspection */
         $unlocker = new ScopedCallback(function () use($cache, $key) {
             $cache->unlock($key);
         });
     } elseif ($staleValue) {
         # Could not acquire lock but an old cache exists, so use it
         return $staleValue['lagTimes'];
     }
     $lagTimes = array();
     foreach ($serverIndexes as $i) {
         if ($i == 0) {
             # Master
             $lagTimes[$i] = 0;
         } elseif (false !== ($conn = $this->parent->getAnyOpenConnection($i))) {
             $lagTimes[$i] = $conn->getLag();
         } elseif (false !== ($conn = $this->parent->openConnection($i, $wiki))) {
             $lagTimes[$i] = $conn->getLag();
             # Close the connection to avoid sleeper connections piling up.
             # Note that the caller will pick one of these DBs and reconnect,
             # which is slightly inefficient, but this only matters for the lag
             # time cache miss cache, which is far less common that cache hits.
             $this->parent->closeConnection($conn);
         }
     }
     # Add a timestamp key so we know when it was cached
     $value = array('lagTimes' => $lagTimes, 'timestamp' => microtime(true));
     $this->mainCache->set($key, $value, $staleTTL);
     $this->srvCache->set($key, $value, $staleTTL);
     wfDebugLog('replication', __METHOD__ . ": re-calculated lag times ({$key})");
     return $value['lagTimes'];
 }
开发者ID:sftsk,项目名称:mediawiki,代码行数:63,代码来源:LoadMonitorMySQL.php

示例4: lock

 public function lock($key, $timeout = 6, $expiry = 6, $rclass = '')
 {
     return $this->backend->lock($key, $timeout, $expiry, $rclass);
 }
开发者ID:paladox,项目名称:mediawiki,代码行数:4,代码来源:CachedBagOStuff.php


注:本文中的BagOStuff::lock方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。