我正在制作一个简单的日志类,使用php的pdo扩展将消息记录到sqlite数据库。日志记录正确,但间歇性缓慢。当我加载页面时,它会快速记录日志,但如果几乎同时加载第二个页面,它有时会挂起。
查看XDEBUG中的概要文件,看起来准备和执行语句有时花费的时间很少,但有时花费的时间更长。当它们较长时,它们总是非常接近秒的倍数(例如1000,1001或2001毫秒)。
我尝试了不同的组合使用开始事务或不PDO::ATTR_PERSISTENT。
有什么建议吗?
这是SQLite的主要缺点。
数据库具有锁机制以防止在执行请求时数据/模式发生更改。大多数数据库服务器将在RAM中工作,然后以线程方式将数据持久化到磁盘(即:写入RAM,返回响应,然后写入磁盘)。您一定已经知道,写入内存要比写入磁盘快无数倍。由于SQLite直接写入磁盘,因此它首先锁定数据库,然后写入,然后释放锁。写(到磁盘)部分比普通数据库服务器(例如:MySQL, PostgreSQL等)花费的时间要长得多,导致在短延迟内执行多个查询时响应时间长。
我发现的解决方案是使用内存数据库(即::memory:
)并定期转储到磁盘。这种方法的主要缺点是磁盘上的数据不一定是最新的数据(因为实际的实时数据存储在内存中)。