什么是锁PHP,PHP简单分布式锁-PHP中的锁
对于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中的锁相关推荐
- MySQL数据库锁构建_MySQL数据库InnoDB存储引擎中的锁机制
00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有 ...
- oracle查看dml锁表,【lock】我所认识的Oracle中的锁,DML锁、DDL锁、闩和内部锁。...
这个问题很简单,你一定对锁有一个认识,但你未必对锁有一个明确的定义. 官方文档这样描述:Locks are mechanisms that prevent destructive interactio ...
- if null 锁 java_史上最全 Java 中各种锁的介绍
什么是锁 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制.锁旨在强制实施互斥排他.并发控制策略. 锁通常需要硬件支持才能有效实施.这 ...
- java 锁 面试题_Java面试题-Java中的锁
1. 如何实现乐观锁(CAS)?如何避免ABA问题? 答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值:第二,替换内存值为要替换值. 2)带参数版本来避免aba ...
- 聊聊MySQL中的锁
原文地址:http://www.linzichen.cn/article/1571531799593484288 在程序开发中,当多个线程并发操作共享数据时,我们需要保证在任何时刻最多只能有一个线程在 ...
- MySQL中的锁机制详细说明
一.MySQL锁机制起步 锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制.MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是在服务器层或者存储引擎层实现的 ...
- 多线程编程进阶——Java类库中的锁
在Java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,在JDK1.5以后,Java类库中新增了Lock接口用来实现类似的锁功能.下面会逐一介绍关于Java类库中所提供的锁功 ...
- Redis 分布式锁没这么简单,网上大多数都有 bug
Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写? 因为看过很多文章没有将分布式锁的各种问题讲明白,所以准备写一篇,也当做自己的学习总结. 在进入正文之前,我 ...
- Go使用redigo实现简单分布式锁
redis分布式锁是 基于setnx的 只在键 key 不存在的情况下, 将键 key 的值设置为 value . 若键 key 已经存在, 则 SETNX 命令不做任何动作. SETNX 是『SET ...
最新文章
- Ubuntu下安装和配置Apache2
- 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
- STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。
- [软件工程学习笔记]个人java小程序---词频统计(二)
- 理解XML Schema: XML Schema 初步 (I)(转)
- Python3安装turtle库(已成功安装)
- MK60单片机开发环境-IAR Embedded Workbench的搭建
- 网页视频无法快进播放时(刷网课)
- 做一个网站要多少钱?
- DS18B20使用说明
- 单片机C语言步进电机实训报告,单片机实验报告步进电机.doc
- js获取手机屏幕宽度
- 使用c++语言做概率论 涉及求方差
- tf.data.Dataset介绍1-from_tensor_slices
- 如何修改计算机无线mac地址,如何修改无线网卡物理地址,求指教
- 归并排序+快排+快速选择+桶排序
- 【BZOJ1135】[POI2009]Lyz 线段树
- 骨传导加动圈,这款Dacom耳机有何出众之处?开箱验证
- git使用进阶(一)
- The bean ‘xxx‘ could not be injected as a ‘xxx‘ because it is a JDK dynamic proxy that implements:
热门文章
- 莫烦python学习笔记之class
- Prometheus 原理和实践,含docker部署Prometheus、node Exporters、Alertmanager、Push Gateway、grafana
- 安卓网络操作全解:发起请求,解析响应
- jquery删除替换元素remove、detach、empty、replaceWith、replaceAll
- caffe将图像数据转换成lmdb文件
- eclipse安装选择清华镜像
- AD打板过程简介(搭配某份教程实现)
- nor flash与nand flash启动的简单比较--APPLE的ARM学习笔记一
- RHEL7忘记密码:修改root密码
- [转]oracle分页用两层循环还是三层循环?