在与 cPanel 的出色支持的交谈中,我们发现了这一点:
这是 eximstats_db.sqlite3 表的权限问题:您尝试以非 root 用户身份访问数据库,但数据库由 root 用户拥有,并且只能由 root 用户写入。
理论上,您应该能够通过将 SQLITE3_OPEN_READONLY 标志传递给打开文件的调用来直接访问该文件,如下所述:
https://secure.php.net/manual/en/sqlite3.open.php
因此授予对 eximstats_db.sqlite3 表的读取权限(注意!有 3 个表):
-rw----r-- 1 root root 135168 Jun 10 06:06 eximstats_db.sqlite3
-rw----r-- 1 root root 32768 Jun 12 14:34 eximstats_db.sqlite3-shm
-rw----r-- 1 root root 1058512 Jun 12 14:34 eximstats_db.sqlite3-wal
并使用
$dbh = new SQLite3('/var/cpanel/eximstats_db.sqlite3',SQLITE3_OPEN_READONLY);
应该有效,但事实并非如此。这似乎是 PHP 中 SQlite3 库的一个限制:即使对于只读访问,它也希望锁定对文件的访问。所以你还需要给他们写权限:
-rw----rw- 1 root root 135168 Jun 10 06:06 eximstats_db.sqlite3
-rw----rw- 1 root root 32768 Jun 12 14:34 eximstats_db.sqlite3-shm
-rw----rw- 1 root root 1058512 Jun 12 14:34 eximstats_db.sqlite3-wal
就是这样。之后,您将看到延迟、失败和其他表。
(当然,在现实生活中,您可能想要创建一个组并仅向该组授予读写访问权限,而不是向所有人授予读写访问权限)。
如果您无法更改这些数据库文件的权限,那么我能看到的唯一解决方案是将文件复制到域,更改那里的权限,然后使用这些文件:
$target = '/var/cpanel/eximstats_db.sqlite3-shm';
$newfile = '/home/yourdomain/where/your/script/is/eximstats_db.sqlite3';
copy($target, $newfile);
chmod($newfile, 0777);
// same with all 3 files..
$dbh = new SQLite3('eximstats_db.sqlite3'); // not '/var/cpanel/eximstats_db.sqlite3'!