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/下的子目录:
- 创建目录并调整权限:
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
- 修改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
相关产品推荐
相关产品推荐

