在 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
就是这样。之后,您将看到 defers、failures 和其他表。
(当然,在现实生活中,您可能希望创建一个组并仅授予该组读写权限,而不是每个人)。
如果您无法更改这些数据库文件的权限,那么我能看到的唯一解决方案是将文件复制到域,更改那里的权限,然后改用这些文件:
$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'!