好吧,这慢慢变得烦人了。我习惯使用 Apache Web 服务器,从来没有遇到过这些问题。IIS 似乎试图变得智能 - 或者其他什么。
我的情况是这样的:我的客户想要一个 PHP 网站,它应该在 Windows IIS 网络服务器上运行。
对于我的开发环境,我可以使用 Apache - 但为了确保万无一失,我也想使用 IIS。因此,我使用 Windows Vista 设置了一个开发服务器,安装了所有最新更新并安装了 IIS。一切都很好!
我很快在 Microsoft 的一些官方网站上找到了有关如何在 IIS 中安装 PHP 的说明。修改了 php.ini - 多年来一直在 Linux/Apache 机器上进行这样的操作。
所以现在我有一个运行 IIS 的服务器和我用来开发的工作站,可以通过网络访问服务器上的文件。
我的第一个“phpinfo()”页面 - 一切正常。现在我故意引入一个错误来破坏页面:我的工作站上只显示“服务器错误 500”。当我直接在服务器上访问该页面时,我看到一条 PHP 错误消息... 好吧,用这个 serverfault.com 问题。
但是:它仍然让我很烦恼:现在如果出现错误,我得到的只是错误消息。我看不到脚本的任何其他输出。事实上,在 Firefox 中,如果出现错误,我什么也看不到。
例如如果我这样做...
<?PHP
$sql = 'THIS WON\'T WORK';
echo $sql;
$DB->exec($sql); // <- This causes an error
?>
我得到的是
PHP Fatal error: Call to a member function exec() on a non-object in C:\inetpub\wwwroot\phpinfo.php on line 4
我真正想要的是它向我显示错误发生之前发生的所有事情的输出,以便我可以使用它来解决我的问题。
我如何让 IIS (或 PHP?) 显示所有内容?错误消息和上下文?通过网络?
更新
好的,我可能找到了线索。当我进入控制台并通过 php-cgi.exe 手动调用脚本时,我得到了以下结果:
PHP Fatal error: Call to a member function exec() on a non-object in C:\inetpub
\wwwroot\phpinfo.php on line 4
X-Powered-By: PHP/5.4.12
Content-type: text/html
THIS WON'T WORK<br />
<b>Fatal error</b>: Call to a member function exec() on a non-object in <b>C:\i
netpub\wwwroot\phpinfo.php</b> on line <b>4</b><br />
然后,我尝试将输出通过管道传输到文件,并发现前两行通过管道传输到 stderr,其余行传输到 stdout(点击此处了解更多信息)。
我还可以看到,我在浏览器中得到的内容是 stderr 的输出,因为它不包含任何 HTML 格式。
现在,我可以将问题缩小到:我有一个 FastCGI PHP-CGI,它将错误消息输出到 stderr,并将导致错误的页面输出到 stdout。它目前将 stderr 转发到浏览器 - 我如何让它改用 stdout?
答案1
...最后我让它工作了。
根据我的 stderr 发现,我进行了更多的谷歌搜索,并找到了关于“使用配置设置保护 PHP“在 IIS.net 上。
我有一台开发机器,所以我并不需要让它变得万无一失,但它仍然有我的解决方案:
fastcgi.logging=0
将其放入您的 PHP.INI 中,PHP 将停止向 stderr 发送内容 - 瞧:我在浏览器窗口中获得了通常的 PHP 输出!