• 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);
            }
        }
    }
  • 相关阅读:
    python-正则表达式
    python-定制类
    阿里云全新发布云市场能力中心,招募10个领域、500家供应商
    《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全
    《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
    《DNS攻击防范科普系列1》—你的DNS服务器真的安全么?
    云栖干货回顾 |“顶级玩家”集结!分布式数据库专场精华解读
    AnalyticDB for PostgreSQL 6.0 新特性介绍
    云栖干货回顾 | 云原生数据库POLARDB专场“硬核”解析
    从零开始入门 K8s | 可观测性:你的应用健康吗?
  • 原文地址:https://www.cnblogs.com/ghjbk/p/7573647.html
Copyright © 2020-2023  润新知