【问题标题】:Empty variable in PHP script causes IIS7 to throw an HTTP 500 errorPHP 脚本中的空变量导致 IIS7 抛出 HTTP 500 错误
【发布时间】:2010-12-08 22:36:11
【问题描述】:

我在我的机器上本地运行 IIS7 和 PHP5,上面的代码将导致 IIS 抛出 HTTP 500 错误。在经历了很多挫折和困惑之后,我发现任何带有空变量的 PHP 脚本都会抛出这个 IIS 错误。下面是一个例子:

<?php $x = $y; ?>

我发现这种行为很奇怪,它破坏了我编写的大部分代码。在大多数情况下,它会阻止我正确调试。我真的很想看到输出和错误消息。此外,这可能会破坏超级全局变量 GET 和 POST 的使用,并且只能通过逻辑来抑制以防止它们执行。

【问题讨论】:

  • 哪个是空变量?我假设$y.

标签: php iis iis-7


【解决方案1】:

PHP 正在抛出异常,打印到标准输出,并且很可能会正确报告错误。 IIS 可能会忽略这一点并抛出 500。

尝试将错误记录到文件中而不是显示它们,这可能会安抚 IIS。我相信是:

display_errors = Off
log_errors = On
error_log = "C:/YourWWW/errors.txt"

...但是我没有方便检查的 php.ini。

回到问题,如果$y为空,你希望PHP做什么?当您尝试分配不存在的变量时,任何理智的编程语言都会呕吐。这听起来很刺耳,但是如果这“破坏了您编写的大部分代码”,那么您就做错了。另外,不确定“打破”$_GET$_POST 的使用是什么意思。如果你的意思是这会抛出 500:

$foo = $_GET["nonexistentvar"];

...那你说得对,它会的。在期望 PHP 分配不存在的内容之前,您应该检查密钥是否存在。战俘,没有 500:

$foo = isset($_GET["nonexistentvar"]) ? $_GET["nonexistentvar"] : NULL;

对不起,如果我听起来充满敌意,但你的问题真的很烦人。

【讨论】:

  • 或者为简洁起见,取决于代码风格: $foo = isset($_GET['nonexistentvar']) ? $_GET['nonexistentvar'] : NULL; $foo = !empty($_GET['nonexistentvar']) ? $_GET['nonexistentvar'] : NULL;第一个用于检查 foo 是否已设置(但可能为空或评估为空的值),第二个用于隐式检查它是否已设置并且还设置为评估为非空的值。所有这些方法都将起作用,并且比不处理空/降低 PHP 的错误级别要好得多。
  • 这听起来确实充满敌意,但我并不因此而恨你,这是可以理解的。我确信这不是因为 PHP 抛出异常,因为在任何其他情况下都不会抛出 500。另外我应该注意,当我只是在测试想法时编写代码时,我不会尝试添加复杂的验证和其他类似的废话,因为它不是生产代码。我没有做错什么。对不起,如果我让你感到困惑,因为你听起来很聪明。这个原型制作过程在 Apache 下运行良好。对不起,如果我听起来充满敌意,但是当你回答我的问题时,你盲目地攻击了我的自我。
  • @Ben:我同意,我把 array_key_exists 扔在那里,因为我已经很久很久没有接触 PHP 并且我不记得 isset()。我已经相应地更新了答案,谢谢。 :)
  • @teh_noob:没有攻击的意思,只是给你一些严厉的爱。一次性测试是可以理解的;但是,我采用所有代码都是生产代码的做法(这是一个很好的做法)。如果您将每一行代码都视为将由其他人审查,那么您就不太可能养成坏习惯。
【解决方案2】:

我通过 fascgi 模块使用 IIS7 + PHP 设置,但没有遇到此问题。 PHP 正确输出错误。我会根据本指南验证您是否正确设置了 PHP 和 IIS:

http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis-70/

最常见的陷阱是您分配 IIS 来调用 php-win.exe 或 php.exe 而不是调用 php-cgi.exe。此外,某些 php.ini 设置可能会导致此问题。但是我不记得是哪个了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2013-10-30
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多