You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache2运行PHP操作SQLite3触发500错误:无法打开数据库文件

问题描述

我编写了一个PHP文件用于在Apache2上展示SQLite数据库内容,代码如下:

<?php
    $connection = new SQLite3('/root/database/clients.db');
    if($connection){
        echo "Connected\n";
    }
    $results = $connection->query('SELECT * FROM USER_LIST');
    while($row=$results->fetchArray(SQLITE3_ASSOC)){
        echo 'user = ' . $row['user'] . '<br>';
        echo 'period = ' . $row['period'] . '<br>';
        echo 'status = ' . $row['status'] . '<br>';

    }
?>

直接通过CLI执行脚本可正常运行:

php -f /var/www/html/index.php

但在Apache2中访问时抛出HTTP ERROR 500错误,Apache错误日志信息如下:

[Tue Oct 17 00:53:13.649296 2023] [php:error] [pid 416648] [client 122.161.69.12:11908] PHP Fatal error: Uncaught Exception: Unable to open database: unable to open database file in /var/www/html/index.php:2\nStack trace:\n#0 /var/www/html/index.php(2): SQLite3->__construct()\n#1 {main}\n thrown in /var/www/html/index.php on line 2

环境版本:Apache/2.4.52 (Ubuntu) | PHP版本:8.1.2-1ubuntu2.14

解决办法

问题核心是权限不足:

  • CLI执行脚本时使用的是当前登录用户(通常是root),拥有/root目录的完全访问权限,因此能正常读取数据库文件。
  • Apache运行PHP脚本时默认使用www-data用户,而/root是root用户的私有目录,其他用户无访问权限,导致无法打开数据库文件。

提供两种解决方式:

方式1:迁移数据库到安全可访问目录(推荐)

将数据库文件移动到Apache有权限访问的目录,比如/var/www/html/下的子目录:

  1. 创建目录并调整权限:
sudo mkdir -p /var/www/html/database
sudo mv /root/database/clients.db /var/www/html/database/
sudo chown -R www-data:www-data /var/www/html/database
sudo chmod -R 750 /var/www/html/database
  1. 修改PHP代码中的数据库路径:
$connection = new SQLite3('/var/www/html/database/clients.db');

方式2:授权www-data访问原目录(不推荐)

若必须保留数据库在/root/database/,可临时调整目录权限:

sudo chmod o+x /root
sudo chown -R root:www-data /root/database
sudo chmod -R 750 /root/database

注意:此操作会降低系统安全性,因为/root目录对其他用户开放了执行权限,生产环境不建议使用。

内容的提问来源于stack exchange,提问作者eternalodballl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:25:21