PHP SQLite PRAGMA journal_mode = wal和只读用户

问题描述:

我读过WAL模式允许用户在写入会话期间阅读。
因此,我应该可以同时有3个会话读取数据和一个写入数据,这对我的使用听起来像是件好事,所以我想我应该定义会话类型,以便系统知道这个会话是否是读者或者使用连接标志的作者。
http://php.net/manual/en/sqlite3.open.php#refsect1-sqlite3.open-parameters
在这里指出,如果会议没有完全关闭该-shm-wal文件不会被删除
https://www.sqlite.org/tempfiles.html#write_ahead_log_wal_files
临时文件不会被删除读会话后,因此意味着会议不会尽管完全关闭调用close函数并返回true,那么为什么在使用SQLITE3_OPEN_READONLY标志时文件不会被删除?我甚至应该使用旗子吗?PHP SQLite PRAGMA journal_mode = wal和只读用户

+0

请阅读[实际文档](http://www.sqlite.org/wal.html#readonly)。 –

+0

我已经阅读过,它不是只读媒体 –

+0

媒体本身并不重要,“需要写入访问权限”。 –

您已将SQLite的'读者'和'编写者'概念与PHP SQLite3驱动程序以只读方式打开文件的能力混为一谈。

使用SQLITE3_OPEN_READONLY标志将导致PHP阻止所有写操作一个警告:

警告:sqlite3的:: EXEC():尝试写...

只读数据库

如果您希望确保应用程序不会发生写入(这可能是一种安全措施),这会很有用。但这与SQLite的读者和作者无关。

作为pointed out by CL访问WAL模式数据库的所有进程都需要写入权限。这是明确documented

此外,如果多个进程访问WAL模式的数据库,然后所有的进程应该根据,让他们写访问数据库文件时,WAL文件的用户或组ID运行,共享内存-shm文件和包含的目录。

而且为在该页面的顶部的缺点提到:

这是不可能打开只读WAL数据库。对于与数据库关联的“-shm”wal-index共享内存文件(如果该文件存在),打开过程必须具有写入权限;否则,如果“-shm”文件不存在,则可以在包含数据库文件的目录上写入访问权限。

SQLite本身决定一个进程在接收到执行命令时是否为读写器。例如,如果单个进程执行SELECT,则INSERT然后SELECT再次从读取器到写入器变为读取器。 SQLite会自动处理锁定(可能阻塞其他进程)。 (请注意,这是一个简单的解释,可能与数据库操作的不同模式有很大不同。)

为了您的目的,您不应该使用SQLITE3_OPEN_READONLY标志。