PHP在require_once时出错

7
我有一个PHP脚本,其中包含(或“需要”)一组其他脚本。这实际上是为了导入我所有的类。我遇到的问题是HTTP 500错误。我已经逐个注释代码,并确定它在我的一个文件中的require_once上失败。
以下是代码:
index.php:
<?php
require_once("std/classes.php");
?>

并且 std/classes.php:

<?php
RequireStandards();
RequireAddons();

function RequireStandards( )
{
    $ClassFiles = scandir("classes/standard");

    foreach( $ClassFiles as $ClassFile )
    {
        if( $ClassFile == "." || $ClassFile == ".." )
            continue;

        //require_once("classes/standard/" . $ClassFile );
    }
}

function RequireAddons()
{
    $ClassFiles = scandir("classes");

    foreach( $ClassFiles as $ClassFile )
    {
        if( $ClassFile == "." || $ClassFile == ".." || $ClassFile == "standard" )
            continue;

        //require_once("classes/" . $ClassFile );
    }
}

?>

这段代码在原位运行正常,但是一旦我取消注释,它就会失败。让我感到奇怪的是,我在这个服务器上有很多其他网站,它们的行为方式几乎相同。
我觉得我可能已经关闭了PHP错误报告...而我不知道如何重新打开它;因为我刚刚升级到PHP 5.3。如果PHP失败,我通常会在浏览器中看到“无法打开文件”之类的错误。
也许有人能告诉我为什么这会返回HTTP 500,或者只是如何重新启用错误报告。非常感谢;这似乎没有太多意义。

你能查看一下你的服务器日志吗? - miku
1
你的类文件夹在根目录下吗?尝试在classes前面添加“/”?只是一个猜测。 - Jim D
可能是您的包含路径有问题。请参考http://www.php.net/manual/en/function.set-include-path.php。 - Alon Eitan
最好使用 $_SERVER['DOCUMENT_ROOT'] . '/classes/standard/; - kpotehin
这些都是有效的注释 - 结果表明,在XAMPP中工作良好的相对路径在IIS上并不那么顺利。重新启用php错误报告后,我设法找出了它们,并加以更正。看来从4.?.?版本到5.3版本文件IO发生了一些变化。 - DigitalJedi805
2个回答

14

启用错误报告:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once("std/classes.php");
?>

希望这能够起作用。

编辑:如果这确实有效,请在将任何内容放入实际公开环境之前记得关闭显示错误!


谢谢。这正是我希望得到的答案。虽然@Madbreaks的回答是'一个答案',但它并不是我所问的答案。我会采纳你的建议Madbreaks,并构建一个AutoLoad,但人们可以开始回答真正的问题,而不是回答“这是你应该写代码的方式”这种看似回答的东西,这是相当令人恼火的,对于“我知道这是有效的php,为什么这个代码不工作”的回复。“无论如何都要感谢你。至于Jim D-这让我重新回到了我的实际PHP错误上,并且现在我可以修复一些“未能打开流”的错误。非常感激。 - DigitalJedi805
@DigitalJedi805 - 很高兴我能帮到你!ini_set('display_errors') 这一部分通常是基于生产/环境常量进行切换的。这样,我就不会粗心大意地忘记关闭它了。 - Jim D

2
您可以使用error_reporting()函数暂时打开错误报告,例如要显示所有错误,请在您的文件中加入以下代码:
error_reporting(E_ALL);
当然,如果要永久更改此设置,您应该编辑您的php.ini文件,并确保启用了error_reporting和display_errors(至少在这不是生产环境的情况下)。您也可以尝试:
ini_set('display_errors', 1);
但是如果页面上有致命错误,则可能无效。再次强调,要永久启用此选项,您必须修改您的php.ini文件。
通常建议仅在非生产系统上启用display_errors,以便用户不会通过您的错误消息获取潜在敏感信息。
在任何情况下,您应该能够在Apache错误日志中找到PHP错误,Ubuntu上的位置为:
/var/log/apache2/error.log
不同的发行版可能会有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接