PHP SQLite PRAGMA journal_mode = wal和readonly用户

时间:2017-06-02 14:23:15

标签: php sqlite readonly pragma sqlite-journal-mode

我读到WAL模式允许用户在写入会话期间进行读取。
因此,我应该能够同时读取数据和一次写入数据,这听起来是件好事。为了我的使用,所以我想我应该定义会话类型,以便系统知道这个会话是使用连接标志的读者还是作者。
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标志时文件没有被删除?我甚至可以使用旗帜吗?

1 个答案:

答案 0 :(得分:1)

您已经将SQLite的“读者”概念混为一谈。和作家'具有PHP SQLite3驱动程序以只读方式打开文件的能力。

使用SQLITE3_OPEN_READONLY标志将导致PHP阻止所有写操作并发出警告:

  

警告:SQLite3 :: exec():尝试在...中编写只读数据库

如果您希望确保应用程序不会发生写入(可能作为安全措施),这将非常有用。但它与SQLite的读者和作家无关。

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

  

此外,如果多个进程要访问WAL模式数据库,那么所有进程都应该在用户或组ID下运行,这些用户或组ID可以对数据库文件,WAL文件,共享内存-shm文件和包含它们进行写访问。 。目录

并且在该页面的顶部提到了一个缺点:

  

无法打开只读WAL数据库。打开过程必须具有#34; -shm"的写入权限。 wal-index与数据库关联的共享内存文件(如果该文件存在),或者如果" -shm"文件不存在。

SQLite本身在收到要执行的命令时决定进程是读者还是编写者。例如,如果单个进程执行SELECT,然后执行INSERT,则SELECT再次从读者更改为编写者到读者。 SQLite将自动处理锁定(可能阻止其他进程)。 (请注意,这是一个简化的解释,对于不同的数据库操作模式可能会有很大不同。)

出于您的目的,您不应使用SQLITE3_OPEN_READONLY标志。