美文网首页
PHP简单分布式锁-PHP中的锁

PHP简单分布式锁-PHP中的锁

作者: 鹅鹅鹅的天歌 | 来源:发表于2018-09-21 16:26 被阅读0次

对于PHP的锁,其实并没有什么太多的概念。抛弃一些第三方的依赖,看看有哪些可用的选择。

  1. 文件锁
  2. PHP的sync扩展
  3. PHP的opcache中的apc_add

目前可以想到的就这么多,在该项目中我们采用文件锁,因为其它的两个需要装扩展。文件锁的逻辑就非常简单了

从网上摘抄了一个例子,使用的eAccelerator 和 文件锁两种 传送门

class FileLock
{
    //文件锁存放路径
    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\\')
    {
        //判断是否存在eAccelerator,这里启用了eAccelerator之后可以进行内存锁提高效率
        $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内存锁,则开启文件锁
        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);
        }
    }
}

使用方法

$lock = new FileLock('key_name');

$lock->lock();

//logic here

$lock->unlock();

相关文章

  • 秒杀随笔

    方法: mysql悲观锁 mysql乐观锁 PHP+redis分布式锁 PHP+redis乐观锁(redis wa...

  • PHP简单分布式锁-PHP中的锁

    对于PHP的锁,其实并没有什么太多的概念。抛弃一些第三方的依赖,看看有哪些可用的选择。 文件锁 PHP的sync扩...

  • PHP实现简单分布式锁

    最近简单设想了一个分布式架构,不考虑高可用的情况。整理如下 整体架构非常简单。首先客户端通过HTTP请求获取锁,同...

  • PHP简单分布式锁-PHP服务器

    接之前的文章,首先我们要实现一个支持http的服务器。百度大法一下,就有了答案。传送门 . 接下来开始上代码 核心...

  • Redis 分布式锁--PHP

    Redis 分布式锁的作用 在单机环境下,有个秒杀商品的活动,在短时间内,服务器压力和流量会陡然上升。这个就会存在...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资...

  • PHP文件锁

    有时候需要避免代码并发执行. 缓存击穿问题. 比如一件商品编号1001.在缓存中它的key为goods:1001,...

  • Redis 文章转载

    php结合redis/lua实现分布式redis锁 Redis面试题整理-字节头条腾讯面试题 (2020最新版含详...

  • Redis实现分布式锁 php

    一、分布式锁的作用: redis写入时不带锁定功能,为防止多个进程同时进行一个操作,出现意想不到的结果,so......

  • PHP关于redis分布式锁

网友评论

      本文标题:PHP简单分布式锁-PHP中的锁

      本文链接:https://www.haomeiwen.com/subject/dojnnftx.html