SQLSTATE[HY000]: 一般错误: 8 尝试写入只读数据库

SQLSTATE[HY000]: 一般错误: 8 尝试写入只读数据库

(也许这个问题适合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

为什么会发生这种情况?

答案1

默认情况下,SELinux 不允许 Web 服务器写入任何文件(上传、SQLite 数据库等)。您需要告诉它哪些文件和目录应该由 Web 服务器写入。

使单个文件可写:

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/myProjetFolder/db/myProjetDb.sqlite"

使整个目录可写:

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/uploads(/.*)?"

然后重置受影响的文件或目录的文件上下文。

restorecon -rv /var/www/uploads
restorecon -v /var/www/myProjetFolder/db/myProjetDb.sqlite

相关内容