Warning: include(): failed to open stream: Permission denied 核心原因:**Web 服務器進程用戶(如 www-data、apache、nginx、IUSR)無讀取目標文件/目錄的權限**。本文提供 Linux、Windows (IIS/Apache) 兩大平台的排查步驟與修復命令。
Warning: include(/global.php): failed to open stream: Permission denied in index.php on line 21
Warning: include(): Failed opening '/global.php' for inclusion (include_path='.;C:\php5\pear')
Fatal error: Class 'fl_global' not found...
第一行 Permission denied 是根因,後續 Class not found 只是連鎖反應。
ps aux | grep -E 'nginx|apache|php-fpm' | head -5
# 典型輸出:www-data、nginx、apache、php-fpm
ls -la /var/www/html/global.php
# -rw-r--r-- 1 root root 1234 Jan 1 00:00 global.php ← 屬主 root,其他用戶可讀 ✅
# -rw------- 1 root root 1234 Jan 1 00:00 global.php ← 其他用戶不可讀 ❌
# 方案 A:授予其他用戶讀取權(通用)
chmod 644 /var/www/html/global.php
chmod 755 /var/www/html/ # 目錄需執行權限才能進入
# 方案 B:修改屬組為 Web 用戶組(推薦生產)
chown -R www-data:www-data /var/www/html/
# 或
chown -R nginx:nginx /var/www/html/
# 方案 C:ACL 精細控制(不改屬主)
setfacl -R -m u:www-data:rX /var/www/html/
setfacl -R -m d:u:www-data:rX /var/www/html/ # 默認 ACL,新文件自動繼承
# CentOS/RHEL 檢查 SELinux
getenforce # Enforcing 表示開啟
ls -Z /var/www/html/global.php # 查看安全上下文
# 若類型非 httpd_sys_content_t,需恢復
restorecon -Rv /var/www/html/
# 臨時關閉測試(生產勿用)
setenforce 0
IIS_IUSRS 或具體應用程序池身份 IIS AppPool\YourPoolName。# httpd.conf 中指定運行用戶(需該用戶存在)
User apache_user
Group apache_group
# 然後在文件夾屬性→安全性中給 apache_user 讀取權限
| 檢查項 | 命令/操作 | 正常標準 |
|---|---|---|
| 文件存在 | ls -l /path/to/file | 存在、非斷鏈 |
| 目錄可進入 | sudo -u www-data ls /path/to/dir | 目錄有 x 權限 |
| 文件可讀 | sudo -u www-data cat /path/to/file | 輸出內容無報錯 |
| open_basedir | php -i | grep open_basedir | 包含目標路徑或未限制 |
| SELinux/AppArmor | getenforce / aa-status | Permissive/Disabled 或正確上下文 |
| PHP 進程用戶 | ps aux | grep php-fpm | 與文件權限匹配 |
chmod 777 臨時解決但極不安全,嚴禁生產使用。x 權限,Web 進程無法 cd 進入目錄讀取文件。chown www-data:www-data + chmod 750/640 + ACL 實現最小權限。