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

如何为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,需注意以下几点:

  1. 修改www.conf配置:
chroot = /var/www/html
chdir = /
  1. 此时PHP会把/var/www/html当作根目录/,index.php中的require路径无需修改:
require_once('/include/DB_tools.php');
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:30:28