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的并发操作相关推荐

  1. 实战并发编程 - 04基于不可变模式解决并发问题_2

    文章目录 Pre 业务描述 短信服务商基本信息 短信路由网关 基于不可变模式改造代码 第一步先将SmsInfo改造为不可变对象 接着在需要将获取服务商列表的代码改造为防御性复制 接着提供一个直接替换S ...

  2. c++ socket 多客户并发访问传输文件_Nginx:论高并发,在座各位都是渣渣

    NGINX 在网络应用中表现超群,在于其独特的设计.许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接. NGI ...

  3. java并发排序_Java基于fork/koin类实现并发排序

    概述 主要谈一谈 Java使用fork/koin类 实现的并发排序 以及对于Stream流的支持的splitetor mismatch() -> 寻找两个数组 第一次出现数据不一致的下标 par ...

  4. 实战并发编程 - 03基于不可变模式解决并发问题_1

    文章目录 Pre 潜在线程不安全的问题 解决方案(不可变类) 如果当前类被子类继承还是一个不可变类吗? 总结步骤 小结 Pre 举个例子 : 对车辆的信息进行跟踪,其中车辆的位置信息的代码如下图 位置 ...

  5. php 使用redis锁限制并发访问类

    1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...

  6. linux线程池实现多线程并发,基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF...

    基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF 第 卷 第 期 电子设计工程 年 月 基于 的多线程池并发 服务器设计 陈 涛 任海兰 武汉邮电科学研究院 湖北 武汉 摘要 时至今 ...

  7. Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET...

    Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET Redis Primer(1)基于JedisP ...

  8. php并发访问排队_php解决高并发问题

    我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键.举个例子,我们假设处理一个业务请求平均响应时间为10 ...

  9. 大数据量高并发访问的数据库优化方法

    一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. ...

  10. EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

    小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ...

最新文章

  1. 电路交换和报文交换和分组交换的概念和区别
  2. vscode php调试插件,构建VSCode开发调试环境(强大且实用的插件推荐)
  3. 【图像分割模型】快速道路场景分割—ENet
  4. Hadoop学习笔记—11.MapReduce中的排序和分组
  5. Windows XP 系统 使用笔记一
  6. array python 交集_模糊数学Python库简介和评测
  7. Tomcat JVM 初始化加大内存
  8. hdu1251(统计难题)
  9. 禅道程序员的10条原则--转载--为了不忘
  10. 《量子计算机简史》--摘
  11. 熟悉JDK8新特性,“Lambda表达式与函数式接口”
  12. sql 跨数据库 连表
  13. python---之os.path.splitext(“文件路径”)
  14. Hadoop权威指南-读书笔记
  15. 一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
  16. 扫二维码登录的实现原理
  17. 存储空间不足,无法处理此命令。 (异常来自 HRESULT:0x80070008)
  18. WINDOWS的远程桌面。
  19. VisionPro脚本
  20. 【paper-note4】Reconfiguring the Imaging Pipeline for Computer Vision

热门文章

  1. 2021-7-20 Cityscape 数据集从19分类到4分类BiSeNetv1-v2训练验证和测试一条龙
  2. 亦真亦幻,A股区块链板块含金量几何?
  3. 移动通信-WCDMA物理信道
  4. 扫描未能发现所选服务器,扫描找不到远程服务器
  5. 南水北调工程简介及线路图
  6. 【托业】【新托业TOEIC新题型真题】学习笔记9-题库七+八--P4-5
  7. 解决ubuntu12.04 virtubox xp 有道词典发音问题
  8. 分库分表:应用场景、方式方法、面临问题
  9. STM32读取MPU6050陀螺仪
  10. 模拟高清和数字高清摄像机的区别,全局快门CMOS 图像传感器,Interline Transfer CCD图像传感器