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

文件锁

PHP的sync扩展

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();

什么是锁PHP,PHP简单分布式锁-PHP中的锁相关推荐

  1. MySQL数据库锁构建_MySQL数据库InnoDB存储引擎中的锁机制

    00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有 ...

  2. oracle查看dml锁表,【lock】我所认识的Oracle中的锁,DML锁、DDL锁、闩和内部锁。...

    这个问题很简单,你一定对锁有一个认识,但你未必对锁有一个明确的定义. 官方文档这样描述:Locks are mechanisms that prevent destructive interactio ...

  3. if null 锁 java_史上最全 Java 中各种锁的介绍

    什么是锁 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制.锁旨在强制实施互斥排他.并发控制策略. 锁通常需要硬件支持才能有效实施.这 ...

  4. java 锁 面试题_Java面试题-Java中的锁

    1. 如何实现乐观锁(CAS)?如何避免ABA问题? 答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值:第二,替换内存值为要替换值. 2)带参数版本来避免aba ...

  5. 聊聊MySQL中的锁

    原文地址:http://www.linzichen.cn/article/1571531799593484288 在程序开发中,当多个线程并发操作共享数据时,我们需要保证在任何时刻最多只能有一个线程在 ...

  6. MySQL中的锁机制详细说明

    一.MySQL锁机制起步 锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制.MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是在服务器层或者存储引擎层实现的 ...

  7. 多线程编程进阶——Java类库中的锁

    在Java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,在JDK1.5以后,Java类库中新增了Lock接口用来实现类似的锁功能.下面会逐一介绍关于Java类库中所提供的锁功 ...

  8. Redis 分布式锁没这么简单,网上大多数都有 bug

    Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写? 因为看过很多文章没有将分布式锁的各种问题讲明白,所以准备写一篇,也当做自己的学习总结. 在进入正文之前,我 ...

  9. Go使用redigo实现简单分布式锁

    redis分布式锁是 基于setnx的 只在键 key 不存在的情况下, 将键 key 的值设置为 value . 若键 key 已经存在, 则 SETNX 命令不做任何动作. SETNX 是『SET ...

最新文章

  1. Ubuntu下安装和配置Apache2
  2. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
  3. STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。
  4. [软件工程学习笔记]个人java小程序---词频统计(二)
  5. 理解XML Schema: XML Schema 初步 (I)(转)
  6. Python3安装turtle库(已成功安装)
  7. MK60单片机开发环境-IAR Embedded Workbench的搭建
  8. 网页视频无法快进播放时(刷网课)
  9. 做一个网站要多少钱?
  10. DS18B20使用说明
  11. 单片机C语言步进电机实训报告,单片机实验报告步进电机.doc
  12. js获取手机屏幕宽度
  13. 使用c++语言做概率论 涉及求方差
  14. tf.data.Dataset介绍1-from_tensor_slices
  15. 如何修改计算机无线mac地址,如何修改无线网卡物理地址,求指教
  16. 归并排序+快排+快速选择+桶排序
  17. 【BZOJ1135】[POI2009]Lyz 线段树
  18. 骨传导加动圈,这款Dacom耳机有何出众之处?开箱验证
  19. git使用进阶(一)
  20. The bean ‘xxx‘ could not be injected as a ‘xxx‘ because it is a JDK dynamic proxy that implements:

热门文章

  1. 莫烦python学习笔记之class
  2. Prometheus 原理和实践,含docker部署Prometheus、node Exporters、Alertmanager、Push Gateway、grafana
  3. 安卓网络操作全解:发起请求,解析响应
  4. jquery删除替换元素remove、detach、empty、replaceWith、replaceAll
  5. caffe将图像数据转换成lmdb文件
  6. eclipse安装选择清华镜像
  7. AD打板过程简介(搭配某份教程实现)
  8. nor flash与nand flash启动的简单比较--APPLE的ARM学习笔记一
  9. RHEL7忘记密码:修改root密码
  10. [转]oracle分页用两层循环还是三层循环?