文件明明存在,却require_once(./*.php)出错

问题描述:

刚装好PMA,在火狐中访问,会看到白板,什么都没输出。使用IE可以看到500错误(服务器内部错误)

打开报错后发现

Warning: require_once(./libraries/common.inc.php) [function.require-once]: failed to open stream: No such file or directory in ***\mousebomb\pma\index.php on line 35

Fatal error: require_once() [function.require]: Failed opening required ‘./libraries/common.inc.php’ (include_path=’.;C:\php5\pear’) in ***\mousebomb\pma\index.php on line 35

而文件是确实存在且IUSR(IIS匿名访问用户)有权限的。

解决方案:

白板的解决:修改php.ini中的相关错误输出设置,默认的php.ini只需要把display_error=off改成display_error=on就可以

require出错解决:require所有./开头的相对路径文件,都必须把上级目录的IUSR开启可读权限。不仅配置PMA,无论什么网站,在wimp下都要注意./开头的文件要想访问都必须上级目录可读

相关文献:

http://hi.baidu.com/ucsec/blog/item/193bc1b6e3ae98fc31add1ab.html

有的时候安装好PHPmyAdmin后,在IE里访问时会出现下面的这种情况:

Warning: require_once(./libraries/common.lib.php): failed to open stream: No such file or directory in ***\index.php on line 40
Fatal error: main(): Failed opening required ‘./libraries/common.lib.php’ (include_path=’.;c:\php5\pear’) in ***\index.php on line 40

出现这种问题的原因有下面几种:

1、你的PHPmyAdmin目录放到了磁盘的根目录下
2、你的PHPmyAdmin目录及上层目录的权限设置问题

解决方法:

·将PHPmyAdmin的目录不要放在磁盘的根目录下,如放在D:\SiteManage\phpmyadmin
·将PHPmyAdmin的目录及上层目录,设置权限如下:
Users    读取和运行
IUSR_……  读取和运行

另外的解决方法:
-----------------

遇到个奇怪的问题。在安装完phpmyadmin后报如下错误:
Warning: require_once(./libraries/common.lib.php) [function.require-once]: failed to open stream: No such file or directory in X:\Xxxxx\phpmyadmin\index.php on line 36
Fatal error: require_once() [function.require]: Failed opening required ‘./libraries/common.lib.php’ (include_path=’.;C:\php5\pear’) in X:\Xxxxx\phpmyadmin\index.php on line 36

将Mysql数据库导入到新装的Mysql5.2中,打开BLog首页,却仍报如上类似错误.

经过一阵调试终于发现解决方法:
原于phpmyadmin与php安装目录的上级ACls权限不够,呵!
给phpmyadmin,php,及它们上一级目录同样的Acls用户读取权;然后再打开Blog,成功搞定! ^_^

注意事项与安全隐患:
1、请不要将phpmyadmin安装在站点或虚拟主机根目录,因为这样guest用户就会拥有根目录的权限。
2、给phpmyadmin给予IIS进程运行用户以及IIS匿名User读取权限即可。强烈建议不要将everyone加入ACLs权限列表。
3、大家在调试程序或配置脚本环境时,请尽量先多看FAQ!然后从报错代码中去寻找原因…(比如上述中错语,你打开index.php的第36行,看PHP代码执行的是什么命令就很清楚错误原因所在了)

注意技巧:

1、不要将phpmyadmin解压安装在根目录,因为这样guest用户就会拥有根目录的权限。
2、给phpmyadmin给予iis用户权限,user组用户权限即可。不建议加everyone权限。

---------

以上两种方法思路一样,大家可试试

<think>好的,用户问的是关于PHP中include_once()包含出错会出现什么情况。我需要先回忆一下PHP中include和include_once的区别。记得include_oncerequire_once的区别在于是否在文件存在时报错级别,include_once如果找不到文件会发出警告但脚本继续执行,而require_once则会致命错误并停止。 用户可能想知道当使用include_once包含文件时如果出错会发生什么,比如文件存在,或者路径错误,或者权限问题等等。首先需要明确include_once的作用,它用于在脚本执行期间包含并运行指定文件,且只会包含一次,防止重复包含。 接下来,要列举不同的错误情况。例如文件路径错误,这时候PHP会发出警告,但脚本继续执行。如果文件存在但里面有语法错误,这时候包含时会解析错误,导致脚本终止。另外,如果包含的文件中有return语句,可能会影响返回值,导致后续代码出现问题。 另外,需要注意include_once和include的区别在于_once会检查是否已经包含过,避免重复。但错误处理方面两者类似。需要说明错误类型,比如E_WARNING,以及是否影响脚本执行。 用户可能的实际场景是他们在开发过程中遇到了include_once的问题,比如文件没找到,或者变量未定义,想知道错误的表现形式以及如何调试。他们可能需要知道如何正确处理包含错误,比如使用错误控制运算符@,或者检查文件是否存在再包含。 还要考虑用户可能的误解,比如认为include_once失败会完全停止脚本,但实际上默认是警告。需要澄清这一点,并给出处理建议,比如使用file_exists检查,或者使用require_once来强制存在性。 可能需要举例说明,比如包含一个不存在文件,然后展示错误信息,接着说明如何捕获这个错误,或者如何处理。同时提到如果包含的文件中有语法错误,比如PHP解析错误,会导致致命错误,脚本停止。 最后总结一下,当include_once出错时的各种情况,包括警告、解析错误、返回值问题,以及如何避免和调试这些问题。</think>在PHP中,`include_once()`函数用于包含并运行指定文件,且**确保文件只被包含一次**。当包含过程中出现错误时,可能会引发以下情况: --- ### **1. 文件路径错误(最常见)** - **现象**: 若文件存在或路径错误,PHP会抛出`E_WARNING`级别错误,但**脚本继续执行**后续代码。 - **示例**: ```php include_once("non_existent_file.php"); echo "这行代码仍会执行"; // 输出正常 ``` - **输出**: `Warning: include_once(non_existent_file.php): Failed to open stream...` `这行代码仍会执行` --- ### **2. 文件存在但包含内容出错** - **情况1:被包含文件有语法错误** - PHP会抛出`Parse Error`(语法解析错误),导致**脚本终止**。 - **示例**(被包含文件`broken.php`内容): ```php <?php echo "缺少闭合引号 // 语法错误 ``` - **结果**: `Parse error: syntax error... in broken.php on line X` - **情况2:被包含文件中有逻辑错误** - 例如调用未定义函数,会触发`Fatal Error`或`Warning`,根据错误类型可能终止或继续执行。 --- ### **3. 返回值问题** - **如果被包含文件有`return`语句**: `include_once()`会返回该文件的返回值,否则默认返回`1`。 - **示例**(被包含文件`config.php`): ```php <?php return ['key' => 'value']; ``` - **主文件**: ```php $config = include_once('config.php'); // $config 接收数组 ``` - **包含失败时返回值**: `include_once()`返回`FALSE`,但需显式判断: ```php if (($result = include_once('file.php')) === false) { echo "包含失败"; } ``` --- ### **4. 重复包含问题** - **设计初衷**: `include_once()`会检查文件是否已被包含,避免重复加载。 - **潜在风险**: 若因路径问题导致同一文件被多次加载(如大小写敏感、相对路径差异),仍可能重复包含。 --- ### **错误处理建议** 1. **防御性编程**: - 使用`file_exists()`或`is_readable()`预先检查文件是否存在: ```php if (file_exists('file.php')) { include_once('file.php'); } ``` - 用`@`抑制错误提示(不推荐,应优先修复路径问题): ```php @include_once('file.php'); ``` 2. **错误日志监控**: 确保`error_reporting(E_ALL)`和`ini_set('display_errors', 0)`在生产环境中启用日志记录,避免敏感信息泄露。 3. **替代方案**: - 使用`require_once()`:文件存在时抛出`Fatal Error`并终止脚本,适合关键依赖文件。 - 结合`set_error_handler()`自定义错误处理逻辑。 --- ### **总结对比表** | 场景 | 错误级别 | 脚本是否继续执行 | 典型原因 | |--------------------------|----------------|------------------|------------------------| | 文件存在/路径错误 | `E_WARNING` | 是 | 拼写错误、权限不足 | | 被包含文件语法错误 | `Parse Error` | 否 | PHP代码语法错误 | | 被包含文件逻辑错误 | `Fatal Error` | 可能终止 | 调用未定义函数/类 | | 重复包含(路径不一致) | 无错误 | 是 | 路径大小写或相对路径差异 | 建议在开发阶段开启严格错误报告,通过工具(如PHPStan)静态分析代码路径,减少运行时包含错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值