php sqlite并发访问,PHP基于文件锁实现sqlite的并发操作
sqlite简单好用,但是不支持多个进程的并行操作,即使并行的读也不行,出现并行读取,会出现database is locked错误。
如果多个进程操作同个sqlite库,通过随机重试可以规避掉一些并行的操作,但是在并发量大的情况下,还是不能完全规避掉并行的操作导致的失败。
完美的解决sqlite的并行操作,还得依靠锁机制,目前锁的实现有多钟方式,可以通过文件锁的方式实现,当然分布式锁也可以用在单机锁上,故redis锁、zookeeper锁等都是一种方案,总体对比,文件锁是最简单的一种方式,下面提供文件锁的一种实现。
class SqliteDataBaseTool
{
private $db = null;
private $lock_file;
public function __construct($file_data,$lock_file)
{
$this->db = new \SQLite3($file_data);
if (!$this->db) {
throw new \Exception("SQLite3 construct failed,err:" . $this->db->lastErrorMsg());
}
$this->lock_file = $lock_file;
}
//日志实现,目前仅仅是echo输出
protected function log($msg)
{
echo $msg.PHP_EOL;
}
public function __call($name, $arguments)
{
if(!method_exists($this,$name))
{
$name = "_".$name;
}
if(method_exists($this,$name))
{
if (!$fp = @fopen($this->lock_file, 'ab')) {
$this->log("fopen $this->lock_file failed!!");
return false;
}
if (flock($fp, LOCK_EX)) {
$result = $this->$name($arguments[0],$arguments[1]);
flock($fp, LOCK_UN);
} else {
fclose($fp);
return false;
}
fclose($fp);
return $result;
} else {
$this->log(__CLASS__." don't exist ".$name);
throw new \Exception(__CLASS__." don't exist ".$name);
}
}
protected function _insert($table,array $data)
{
echo "insert".PHP_EOL;
}
public function _query($table,array $where)
{
echo "query".PHP_EOL;
}
public function _delete($table,array $where)
{
echo "delete".PHP_EOL;
}
public function __destruct()
{
if($this->db!=null) {
$this->db->close();
unset($this->db);
}
}
}
$s = new SqliteDataBaseTool("/tmp/test.db","/tmp/test.lock");
$s->insert("t_test",[]);
$s->query("t_test",[]);
$s->delete("t_test",[]);
标签:function,sqlite,name,lock,db,echo,并发,PHP
来源: https://blog.csdn.net/u013702678/article/details/87890228
php sqlite并发访问,PHP基于文件锁实现sqlite的并发操作相关推荐
- 实战并发编程 - 04基于不可变模式解决并发问题_2
文章目录 Pre 业务描述 短信服务商基本信息 短信路由网关 基于不可变模式改造代码 第一步先将SmsInfo改造为不可变对象 接着在需要将获取服务商列表的代码改造为防御性复制 接着提供一个直接替换S ...
- c++ socket 多客户并发访问传输文件_Nginx:论高并发,在座各位都是渣渣
NGINX 在网络应用中表现超群,在于其独特的设计.许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接. NGI ...
- java并发排序_Java基于fork/koin类实现并发排序
概述 主要谈一谈 Java使用fork/koin类 实现的并发排序 以及对于Stream流的支持的splitetor mismatch() -> 寻找两个数组 第一次出现数据不一致的下标 par ...
- 实战并发编程 - 03基于不可变模式解决并发问题_1
文章目录 Pre 潜在线程不安全的问题 解决方案(不可变类) 如果当前类被子类继承还是一个不可变类吗? 总结步骤 小结 Pre 举个例子 : 对车辆的信息进行跟踪,其中车辆的位置信息的代码如下图 位置 ...
- php 使用redis锁限制并发访问类
1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...
- linux线程池实现多线程并发,基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF...
基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF 第 卷 第 期 电子设计工程 年 月 基于 的多线程池并发 服务器设计 陈 涛 任海兰 武汉邮电科学研究院 湖北 武汉 摘要 时至今 ...
- Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET...
Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET Redis Primer(1)基于JedisP ...
- php并发访问排队_php解决高并发问题
我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键.举个例子,我们假设处理一个业务请求平均响应时间为10 ...
- 大数据量高并发访问的数据库优化方法
一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. ...
- EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ...
最新文章
- 电路交换和报文交换和分组交换的概念和区别
- vscode php调试插件,构建VSCode开发调试环境(强大且实用的插件推荐)
- 【图像分割模型】快速道路场景分割—ENet
- Hadoop学习笔记—11.MapReduce中的排序和分组
- Windows XP 系统 使用笔记一
- array python 交集_模糊数学Python库简介和评测
- Tomcat JVM 初始化加大内存
- hdu1251(统计难题)
- 禅道程序员的10条原则--转载--为了不忘
- 《量子计算机简史》--摘
- 熟悉JDK8新特性,“Lambda表达式与函数式接口”
- sql 跨数据库 连表
- python---之os.path.splitext(“文件路径”)
- Hadoop权威指南-读书笔记
- 一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
- 扫二维码登录的实现原理
- 存储空间不足,无法处理此命令。 (异常来自 HRESULT:0x80070008)
- WINDOWS的远程桌面。
- VisionPro脚本
- 【paper-note4】Reconfiguring the Imaging Pipeline for Computer Vision
热门文章
- 2021-7-20 Cityscape 数据集从19分类到4分类BiSeNetv1-v2训练验证和测试一条龙
- 亦真亦幻,A股区块链板块含金量几何?
- 移动通信-WCDMA物理信道
- 扫描未能发现所选服务器,扫描找不到远程服务器
- 南水北调工程简介及线路图
- 【托业】【新托业TOEIC新题型真题】学习笔记9-题库七+八--P4-5
- 解决ubuntu12.04 virtubox xp 有道词典发音问题
- 分库分表:应用场景、方式方法、面临问题
- STM32读取MPU6050陀螺仪
- 模拟高清和数字高清摄像机的区别,全局快门CMOS 图像传感器,Interline Transfer CCD图像传感器