(也许这个问题适合 SO,但我认为它与我的代码无关)。
我使用 SQLite3 作为我的 Web 应用程序的数据库引擎。
我刚刚将它部署在生产服务器上,但它没有按预期工作。
我正在使用 PDO(一个 PHP DB 接口)来访问这个 DB,但是每当我尝试在其中写一些东西时,我都会收到错误消息:
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
生产服务器是一个运行 Httpd(所以 Apache)的 Centos 8。我已将整个文件夹的权限设置为 777(这只是一个测试,不要怪我),但仍然出现错误。
我读过很多关于这个错误的东西,但没有一个对我有用。
有趣的是,运行时:
php -r 'var_dump(
$db=new PDO("sqlite:/var/www/myProjetFolder/db/myProjetDb.sqlite"),
$q=$db->query("SELECT * FROM sqlite_master"),
$q->fetchAll()); '
在 Web 服务器的根目录下,我得到了我的数据库的内容,所以我猜权利是好的。
准确地说,我的项目存储在/var/www/myProjectFolder/
.
我暂时没有创建任何 vHost,我只是编辑了 httpd.conf 并更改了DocumentRoot
.
为什么会这样?
默认情况下,SELinux 不允许 Web 服务器写入任何文件(上传文件、您的 SQLite 数据库等)。您需要告诉它哪些文件和目录应该可以被 Web 服务器写入。
使单个文件可写:
使整个目录可写:
然后重置受影响文件或目录的文件上下文。