最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

并發(fā)下常見的加鎖及鎖的PHP具體實現(xiàn)代碼

 更新時間:2010年10月12日 08:48:48   作者:  
用到了Eaccelerator的內(nèi)存鎖 和 文件鎖,原理如下判斷系統(tǒng)中是否安了EAccelerator 如果有則使用內(nèi)存鎖,如果不存在,則進行文件鎖
在最近的項目中有這樣的場景
1.生成文件的時候,由于多用戶都有權限進行生成,防止并發(fā)下,導致生成的結果出現(xiàn)錯誤,需要對生成的過程進行加鎖,只容許一個用戶在一個時間內(nèi)進行操作,這個時候就需要用到鎖了,將這個操作過程鎖起來.
2.在用了cache的時候,cache失效可能導致瞬間的多數(shù)并發(fā)請求穿透到數(shù)據(jù)庫此時也可以得需要用鎖在同一并發(fā)的過程中將這個操作鎖定.

針對以上的2種情況,現(xiàn)在的解決方法是對處理過程進行鎖機制,通過PHP實現(xiàn)如下
用到了Eaccelerator的內(nèi)存鎖 和 文件鎖,原理如下
判斷系統(tǒng)中是否安了EAccelerator 如果有則使用內(nèi)存鎖,如果不存在,則進行文件鎖
根據(jù)帶入的key的不同可以實現(xiàn)多個鎖直接的并行處理,類似Innodb的行級鎖

使用如下:
$lock = new CacheLock('key_name');
$lock->lock();
//logic here
$lock->unlock();
//使用過程中需要注意下文件鎖所在路徑需要有寫權限.
具體類如下:
復制代碼 代碼如下:

<?php
/**
* CacheLock 進程鎖,主要用來進行cache失效時的單進程cache獲取,防止過多的SQL請求穿透到數(shù)據(jù)庫
* 用于解決PHP在并發(fā)時候的鎖控制,通過文件/eaccelerator進行進程間鎖定
* 如果沒有使用eaccelerator則進行進行文件鎖處理,會做對應目錄下產(chǎn)生對應粒度的鎖
* 使用了eaccelerator則在內(nèi)存中處理,性能相對較高
* 不同的鎖之間并行執(zhí)行,類似mysql innodb的行級鎖
* 本類在sunli的phplock的基礎上做了少許修改 http://code.google.com/p/phplock
* @author yangxinqi
*
*/
class CacheLock
{
//文件鎖存放路徑
private $path = null;
//文件句柄
private $fp = null;
//鎖粒度,設置越大粒度越小
private $hashNum = 100;
//cache key
private $name;
//是否存在eaccelerator標志
private $eAccelerator = false;
/**
* 構造函數(shù)
* 傳入鎖的存放路徑,及cache key的名稱,這樣可以進行并發(fā)
* @param string $path 鎖的存放目錄,以"/"結尾
* @param string $name cache key
*/
public function __construct($name,$path='lock\\')
{
//判斷是否存在eAccelerator,這里啟用了eAccelerator之后可以進行內(nèi)存鎖提高效率
$this->eAccelerator = function_exists("eaccelerator_lock");
if(!$this->eAccelerator)
{
$this->path = $path.($this->_mycrc32($name) % $this->hashNum).'.txt';
}
$this->name = $name;
}
/**
* crc32
* crc32封裝
* @param int $string
* @return int
*/
private function _mycrc32($string)
{
$crc = abs (crc32($string));
if ($crc & 0x80000000) {
$crc ^= 0xffffffff;
$crc += 1;
}
return $crc;
}
/**
* 加鎖
* Enter description here ...
*/
public function lock()
{
//如果無法開啟ea內(nèi)存鎖,則開啟文件鎖
if(!$this->eAccelerator)
{
//配置目錄權限可寫
$this->fp = fopen($this->path, 'w+');
if($this->fp === false)
{
return false;
}
return flock($this->fp, LOCK_EX);
}else{
return eaccelerator_lock($this->name);
}
}
/**
* 解鎖
* Enter description here ...
*/
public function unlock()
{
if(!$this->eAccelerator)
{
if($this->fp !== false)
{
flock($this->fp, LOCK_UN);
clearstatcache();
}
//進行關閉
fclose($this->fp);
}else{
return eaccelerator_unlock($this->name);
}
}
}

本類在孫立同學的類的基礎上做了小點改進的了.具體可以看 http://code.google.com/p/phplock 感謝孫同學的分享精神!

相關文章

  • php中文亂碼問題的終極解決方案匯總

    php中文亂碼問題的終極解決方案匯總

    亂碼是我們在開發(fā)可能經(jīng)常遇見,也是最讓人頭疼的一個問題了,下面這篇文章主要介紹了在php開發(fā)中,可能遇見中文亂碼問題的終極解決方案,文中介紹好幾個情況下的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • php保存信息到當前Session的方法

    php保存信息到當前Session的方法

    這篇文章主要介紹了php保存信息到當前Session的方法,實例分析了php中session的使用技巧,需要的朋友可以參考下
    2015-03-03
  • php日志函數(shù)error_log用法實例分析

    php日志函數(shù)error_log用法實例分析

    這篇文章主要介紹了php日志函數(shù)error_log用法,結合實例形式分析了php日志函數(shù)error_log相關的配置文件設置、函數(shù)功能、用法與使用注意事項,需要的朋友可以參考下
    2019-09-09
  • PHP自定義函數(shù)獲取URL中一級域名的方法

    PHP自定義函數(shù)獲取URL中一級域名的方法

    這篇文章主要介紹了PHP自定義函數(shù)獲取URL中一級域名的方法,涉及字符串與數(shù)組相關操作技巧,需要的朋友可以參考下
    2016-08-08
  • 詳解WordPress中調(diào)用評論模板和循環(huán)輸出評論的PHP函數(shù)

    詳解WordPress中調(diào)用評論模板和循環(huán)輸出評論的PHP函數(shù)

    這篇文章主要介紹了WordPress中調(diào)用評論模板和循環(huán)輸出評論的PHP函數(shù),分別是comments_template函數(shù)與wp_list_comments函數(shù)的使用,需要的朋友可以參考下
    2016-01-01
  • PHP入門教程之圖像處理技巧分析

    PHP入門教程之圖像處理技巧分析

    這篇文章主要介紹了PHP入門教程之圖像處理技巧,結合實例形式分析了圖形圖像的創(chuàng)建與顯示方法,并附帶了創(chuàng)建圖形驗證碼及縮略圖等應用的具體示例,需要的朋友可以參考下
    2016-09-09
  • php 字符轉義 注意事項

    php 字符轉義 注意事項

    今天碰到一個處理文件特殊字符的事情,再次注意到這個問題
    2009-05-05
  • PHP 解決utf-8和gb2312編碼轉換問題

    PHP 解決utf-8和gb2312編碼轉換問題

    就一個很簡單的函數(shù)iconv();但是就是這個函數(shù)在網(wǎng)上找了很多例子,都無法成功轉換,這是為什么呢?
    2010-03-03
  • shell腳本作為保證PHP腳本不掛掉的守護進程實例分享

    shell腳本作為保證PHP腳本不掛掉的守護進程實例分享

    以下是對用shell腳本作為保證PHP腳本不掛掉的守護進程實例進行了分析介紹,需要的朋友可以參考下
    2013-07-07
  • 淺談如何提高PHP代碼質量之端到端集成測試

    淺談如何提高PHP代碼質量之端到端集成測試

    在本系列的前幾部分中,我們建立了一個構建工具,一些靜態(tài)代碼分析器,并開始編寫單元測試。為了使我們的測試堆棧更完整,有一些測試可以檢查你的代碼是否在真實環(huán)境中運行,以及它是否能在更復雜的業(yè)務場景中運行良好。
    2021-05-05

最新評論

许昌市| 应用必备| 康平县| 赫章县| 南昌市| 通城县| 淳化县| 滨海县| 宁都县| 宁都县| 滨海县| 中江县| 县级市| 丹巴县| 临泉县| 阿尔山市| 龙州县| 彰化县| 武乡县| 涟水县| 论坛| 十堰市| 西丰县| 宜宾市| 托克托县| 上杭县| 九龙坡区| 闸北区| 孝昌县| 方山县| 蛟河市| 庄浪县| 日土县| 黄大仙区| 潜山县| 淮滨县| 贵溪市| 吴川市| 许昌市| 屯门区| 宁强县|