如何为Docker化的PHP+Nginx环境配置根包含路径?
问题
运行index.php时出现致命错误:
Fatal error: Uncaught Error: Failed opening required '/include/DB_tools.php' (include_path='/var/www/html/') in /var/www/html/index.php:3 Stack trace: #0 {main} thrown in /var/www/html/index.php on line 3
错误代码在index.php第3行:
require_once('/include/DB_tools.php');
文件结构:
var └── www └── html ├── include │ └── DB_tools.php └── index.php
需在Docker+Nginx+PHP-FPM环境中配置PHP根包含路径,已尝试以下方法但失败:
- 在PHP-FPM的
/usr/local/etc/php-fpm.d/www.conf中设置:
chroot = /var/www/html/ chdir = /
出现"File not found"错误。
- 在Nginx的
default.conf中添加:
fastcgi_param PHP_VALUE "include_path=/var/www/html/";
无效果。
docker-compose配置:
version: '3.9' services: web: image: nginx:latest ports: - '8080:80' volumes: - ./src:/var/www/html - ./default.conf:/etc/nginx/conf.d/default.conf links: - php-fpm php-fpm: image: php:8-fpm volumes: - ./src:/var/www/html
Nginx配置文件:
server { index index.php index.html; server_name localhost; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/html; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php-fpm:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
解决方法
方案一:修改require路径(最直接)
把index.php中的绝对路径改为相对路径或基于项目根的路径:
// 相对路径(从index.php所在目录指向include文件夹) require_once('./include/DB_tools.php'); // 或者用服务器文档根目录拼接 require_once($_SERVER['DOCUMENT_ROOT'] . '/include/DB_tools.php');
方案二:正确配置PHP的include_path
方法1:通过Nginx传递参数
在Nginx的location ~ \.php$块中,修改PHP_VALUE配置,保留默认包含路径避免覆盖,且要放在include fastcgi_params;之后:
include fastcgi_params; fastcgi_param PHP_VALUE "include_path=/var/www/html:.";
方法2:直接修改PHP配置文件
进入PHP-FPM容器:
docker exec -it [你的php-fpm容器名称] bash
官方PHP-FPM镜像默认没有php.ini,先复制模板生成:
cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
编辑/usr/local/etc/php/php.ini,找到include_path项修改:
include_path = ".:/var/www/html"
修改后重启PHP-FPM容器:
docker restart [你的php-fpm容器名称]
方案三:正确配置chroot(复杂度较高)
如果一定要用chroot,需注意以下几点:
- 修改
www.conf配置:
chroot = /var/www/html chdir = /
- 此时PHP会把
/var/www/html当作根目录/,index.php中的require路径无需修改:
require_once('/include/DB_tools.php');
- 调整Nginx的
SCRIPT_FILENAME参数,传递相对chroot的路径:
fastcgi_param SCRIPT_FILENAME /$fastcgi_script_name;
注意:chroot后PHP依赖的系统库需要存在于chroot目录内,官方镜像可能缺少相关文件,新手不推荐使用。
验证配置有效性
在index.php中添加以下代码,访问页面即可查看当前include_path:
echo ini_get('include_path');
内容的提问来源于stack exchange,提问作者0xC0DEGURU
相关产品推荐
相关产品推荐

