zoukankan      html  css  js  c++  java
  • PHP进程锁

    <?php
    /**
     * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库
     * 用于解决PHP在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定
     * 如果没有使用eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁
     * 使用了eaccelerator则在内存中处理,性能相对较高
     * 不同的锁之间并行执行,类似mysql innodb的行级锁
     * 本类在sunli的phplock的基础上做了少许修改  http://code.google.com/p/phplock
     * @author yangxinqi
     *
     */
    namespace CommonBusiness;
    
    
    class PhpLock
    {
        //文件锁存放路径
        private $path = null;
        //文件句柄
        private $fp = null;
        //锁粒度,设置越大粒度越小
        private $hashNum = 100;
        //cache key
        private $name;
        //是否存在eaccelerator标志
        private  $eAccelerator = false;
    
        /**
         * 构造函数
         * 传入锁的存放路径,及cache key的名称,这样可以进行并发
         * @param string $path 锁的存放目录,以"/"结尾
         * @param string $name cache key
         */
        public function __construct($name,$path='lock\')
        {
            $app_path = str_replace('ThinkPHP/', '', THINK_PATH);
            $is_cli = php_sapi_name();
            if($is_cli == 'cli' || $is_cli == 'cli_server')
            {
                $app_path = trim(APP_PATH, '.');
            }
            else
            {
                $app_path = $app_path . trim(APP_PATH, '.');
            }
    
            $path = $app_path.'/Common/Business/lockfile/';
            if(!file_exists($path))
            {
                mkdir($path);
                chmod($path,777);
            }
            //$path .= '/protected/runtime/cache/';
            //判断是否存在eAccelerator,这里启用了eAccelerator之后可以进行内存锁提高效率
            $this->eAccelerator = function_exists("eaccelerator_lock");
            if(!$this->eAccelerator)
            {
                //$this->path = $path.($this->_mycrc32($name) % $this->hashNum).'.txt';
                $this->path = $path.sha1($name).'.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内存锁,则开启文件锁
            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);
            }
        }
    }
    

      

  • 相关阅读:
    HDU 2639 Bone Collector II (01背包,第k解)
    POJ 2184 Cow Exhibition 奶牛展(01背包,变形)
    hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
    UVA 562 Dividing coins 分硬币(01背包,简单变形)
    POJ Charm Bracelet 挑饰品 (常规01背包)
    hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)
    UVA 624 CD(01背包,要记录路径)
    118 Pascal's Triangle 帕斯卡三角形 杨辉三角形
    117 Populating Next Right Pointers in Each Node II 每个节点的右向指针 II
    116 Populating Next Right Pointers in Each Node 每个节点的右向指针
  • 原文地址:https://www.cnblogs.com/diguaer/p/7505931.html
Copyright © 2011-2022 走看看