使用AMPPs时require_once触发Permission denied错误的解决方法
问题回顾
你在Category.class.php中使用require_once调用模板文件时遇到了权限拒绝和路径无法解析的错误,具体报错如下:
Warning: require_once(C:\Program Files\Ampps\www\admin-panel): failed to open stream: Permission denied in C:\Program Files\Ampps\www\admin-panel\admin-dashboard\Category.class.php on line 22
Fatal error: require_once(): Failed opening required '' (include_path='.;C:\php\pear') in C:\Program Files\Ampps\www\admin-panel\admin-dashboard\Category.class.php on line 22
对应的调用代码和.htaccess配置分别是:
调用函数代码
public function index() { $db = new DataBase(); $categories = $db->select("SELECT * FROM `categories` ORDER BY `id` DESC;"); require_once(realpath(dirname(__FILE__) . "../template/admin/category/index.php")); }
.htaccess配置
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ admin-panel/index.php [QSA,L]
分步解决方案
1. 优先修复路径拼接错误
这是最核心的问题!你当前的路径拼接缺少了目录分隔符:
dirname(__FILE__)返回的是C:\Program Files\Ampps\www\admin-panel\admin-dashboard- 直接拼接
../template/...会变成admin-dashboard../template,这是一个无效的路径 realpath解析无效路径会返回false,导致require_once尝试加载admin-panel目录而非目标文件,最终触发权限拒绝错误
修改路径拼接,推荐两种方式:
// 方式1:用PHP内置常量保证跨平台兼容性(Windows/Linux都适用) require_once(realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . "../template/admin/category/index.php")); // 方式2:直接添加斜杠(更简洁,多数环境都支持) require_once(realpath(dirname(__FILE__) . "/../template/admin/category/index.php"));
2. 调整目录/文件权限(路径修复后仍报错时)
如果路径修复后还是提示权限拒绝,需要确保目标文件和目录有可读权限:
- 在Windows系统中:右键
template/admin/category目录或index.php文件 → 属性 → 安全 → 给Apache运行用户(通常是IUSR或Apache用户组)添加读取和执行权限 - 如果你用Ampps面板管理站点,可以直接在面板的站点设置里找到权限配置项,确保文件目录权限正确
3. 用绝对路径彻底避免路径混淆(可选但推荐)
为了避免后续因文件位置变动或URL重写导致的路径问题,建议在项目入口文件(比如admin-panel/index.php)中定义根目录常量,然后在所有文件中使用绝对路径:
在入口文件添加:
// 定义项目根目录(__DIR__是入口文件所在的admin-panel目录) define('PROJECT_ROOT', realpath(__DIR__));
然后在Category.class.php中调用:
require_once(PROJECT_ROOT . "/template/admin/category/index.php");
这种方式不受当前文件位置影响,路径解析更可靠。
内容的提问来源于stack exchange,提问作者roz333

