Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有多个写入的PDO Sqlite阻塞_Php_Sqlite_Pdo - Fatal编程技术网

Php 具有多个写入的PDO Sqlite阻塞

Php 具有多个写入的PDO Sqlite阻塞,php,sqlite,pdo,Php,Sqlite,Pdo,我正在创建一个简单的日志类,它使用php的pdo扩展将消息记录到sqlite数据库。它正在正确记录,但间歇缓慢。当我加载页面时,它会快速登录,但如果第二个页面几乎同时加载,它有时会挂起 从XDEBUG查看一个概要文件,看起来prepare和execute语句有时花费很少的时间,但有时花费更长的时间。当它们较长时,它们总是非常接近秒的倍数(例如1000、1001或2001毫秒) 我尝试了使用BeginTransaction与否和PDO::ATTR_PERSISTENT的不同组合 有什么建议吗?这是

我正在创建一个简单的日志类,它使用php的pdo扩展将消息记录到sqlite数据库。它正在正确记录,但间歇缓慢。当我加载页面时,它会快速登录,但如果第二个页面几乎同时加载,它有时会挂起

从XDEBUG查看一个概要文件,看起来prepare和execute语句有时花费很少的时间,但有时花费更长的时间。当它们较长时,它们总是非常接近秒的倍数(例如1000、1001或2001毫秒)

我尝试了使用BeginTransaction与否和PDO::ATTR_PERSISTENT的不同组合


有什么建议吗?

这是SQLite的主要缺点

数据库有一个锁定机制,以防止在执行请求时更改数据/架构。大多数数据库服务器将在RAM中工作,然后以线程方式将数据持久化到磁盘(即:写入RAM,返回响应,然后写入磁盘)。您必须已经知道,写入内存比写入磁盘快数百万倍。由于SQLite直接写入磁盘,因此它首先锁定数据库,然后写入并释放锁。写(到磁盘)部分比常规数据库服务器(例如MySQL、PostgreSQL等)需要更长的时间,导致在短延迟内执行多个查询时响应时间较长

我找到的解决方案是使用内存数据库(即:
:内存:
),并定期转储到磁盘。
这种方法的主要缺点是磁盘上的数据不一定是最新数据的最新数据(因为实际的实时数据存储在内存中)


没有神奇的解决方案,这是SQLite的根本“问题”。如果您计划在一个数据库上运行多个并发写入操作,您应该考虑改用实际的数据库服务器。

我知道写入磁盘的速度将比内存慢,锁定将发挥作用,并且SQLite不如其他服务器快,但这个问题只出现在几次写操作中,而且是断断续续地发生的,而当它发生时,需要花费非常可疑的时间(几乎是秒的倍数)。由于这些原因,我认为答案不仅仅是SQLite不够快。即使其他写操作都被阻塞,我也不希望两到三次写操作(几乎完全)需要1000毫秒。