15

在我的私人 WAMP PC 上运行一些 PHP 代码时,我突然从服务器收到空白响应 - 实际上没有响应。没有标题,没有数据,PHP 错误日志中没有任何内容,nada。我重新启动了 APACHE 和 PHP,但仍然没有。我知道 php 可以正常工作,因为我可以很好地访问其他 PHP 脚本。

Firebug 报告没有标题,?字节,并且“加载”只需要163 毫秒(所以它不是超时)。我考虑过快速消耗内存 - 但我监控了我的 PC 的内存,它没有显示任何峰值。到目前为止,错误和异常一直运行良好。

世界上有什么?

max_execution_time = 30 ;
max_input_time = 60 ; 
max_input_nesting_level = 64 ; 
memory_limit = 500M ;

error_reporting = E_ALL | E_NOTICE | E_STRICT
display_errors = On
log_errors = On

:编辑:

我不会碰@十英尺长的杆子。我认为 ruby​​ 家伙把它扔在那里,所以程序员会放弃 PHP。

无论如何,我启用了 xdebug 并且它没有输出任何研磨文件。然后我接受了 zombat 的建议并在页面顶部放置了一个 DIE() 并且它起作用了。我想我只是有一些非常奇怪的代码完全杀死了 PHP。即使错误被禁用或抑制,@我仍然应该从服务器取回带有空内容的标头!

如果我发现更多我会回帖。

4

12 回答 12

12

从控制台运行页面,您将收到错误消息。

// nix
php yourFile.php

// Windows
c:\path\to\php.exe yourFile.php
于 2009-12-22T05:55:53.743 回答
6

您可以在此目录中有一个 .htaccess 文件,该文件已修改错误报告。

要进行测试,请尝试在您的 php 脚本顶部显式设置这些选项,这会给您带来麻烦。

ini_set('display_errors',1);
error_reporting(E_ALL);

我也看到过热心的防病毒包造成的。有些包含用于过滤互联网和电子邮件的网络代理软件。在这种情况下,页面只会继续加载到无穷大,但永远不会完成。

于 2009-12-22T04:26:57.837 回答
6

当心@(错误抑制)运算符,如果您在带有@ 的行上出现语法错误,PHP 将静默退出。

要检测这种情况,请使用set_error_handler并编写您自己的错误处理程序,您仍然会在使用 @ 的情况下被调用。

于 2009-12-22T05:25:17.127 回答
6

您说其他 PHP 脚本正在运行,这表明它可能不是 Apache 问题。您的所有日志记录设置似乎都正确,并且没有记录任何内容,因此 PHP 很可能在输出任何内容之前正常退出。以下情况之一可能为真:

  • 错位的exit()说法?您正在处理代码,也许您添加了快速exit()检查某些内容,却忘记删除它?
  • don.neufeld 检查@操作符使用情况的想法,它会抑制任何错误消息,过去花费了我数小时的调试时间。绝对要寻找的东西。

在这种情况下,穷人的调试方法可以产生一些快速的结果。在此处exit('wtf');输入相关脚本的第一行。那运行吗?无论结果如何,该测试的结果立即排除了各种可能性。如果您没有得到任何输出,则可能是服务器级别的问题(配置、错误模块等),但请注意任何更高级别的缓冲。如果你确实得到了输出,那么你就知道服务器很好,问题在于你的脚本更深层次,在这种情况下,你可以将exit()调用向下移动几行,冲洗并重复。这不是一种优雅的调试方式,但它又快又脏,而且您可能会在几分钟内找到问题所在。

于 2009-12-22T07:52:11.813 回答
1

检查 php.ini 设置是否为 short_open_tag = On 或 short_open_tag = Off

于 2009-12-22T05:02:54.060 回答
1

这里最有可能的是 apache 崩溃了。可能查看 apache 错误日志,或附加调试器。

在 Windows 上查看调试 apache/php 进程的详细信息可以在http://bugs.php.net/bugs-generating-backtrace-win32.php找到

于 2009-12-22T05:23:20.360 回答
1

我猜到了这个问题的答案——原来 PHP 5.2.5 不能处理递归死亡。

<?php

class A
{
    public function __construct()
    {
        new B;
    }
}

class B 
{
    public function __construct()
    {
        new A;
    }
}

new A;

print 'Loaded Class A';

没有标题、错误、内容、日志、xdebug 转储、内存峰值、CPU 峰值、服务器崩溃或任何东西。大约 150 毫秒后,PHP 就“结束”了。奇怪的。

于 2009-12-22T23:09:18.027 回答
1

要在您的 PHP 代码中激活错误显示以防您看不到任何内容,请插入

ini_set('display_errors',1); 
error_reporting(E_ALL);

这个潜力可以为您节省大量时间的示例:

joomla default.php 模板文件中的此代码显示没有错误消息的空白页面,没有第 20 和 21 行

17  <?php if ($params->get('title_article_linkable')) { ?>
18      <a href="<?php 
19          $url = JRoute::_(ContentHelperRoute::getArticleRoute($item->id,$item->catid));
20          ini_set('display_errors',1);
21          error_reporting(E_ALL);
22          echo $url; ?>">
23      <?php echo $this->item->title; ?></a> // should be $item->title !!
24  <?phpLL000000 } else { ?>
25      <?php echo $item->title; ?>
26  <?php } ?>

输出:

在此处输入图像描述

于 2013-02-09T23:55:41.900 回答
0

检查事件日志。

于 2009-12-22T04:31:02.267 回答
0

发生这种情况时,通常值得尽可能多地删除代码并查看是否可以在页面上显示某些内容。

这可能是由于代码中某处未闭合的引号或未闭合的大括号造成的。这可能会导致 echo 语句被视为文本或其他函数等。

而且,虽然应该报告所有错误,但我发现并非所有错误都被实际报告,可能是因为共享主机上的 ini 设置超出了我的范围。

注释掉并不总是足够的 - 不知道为什么不。发生这种情况时,我通常发现复制页面是最快的,然后慢慢地剪切和粘贴部分直到我发现错误,之后我可以因为一个愚蠢的错字而踢自己。

于 2009-12-22T20:15:31.167 回答
0

我遇到了同样的问题,因为我正在使用:

ob_flush()

于 2020-10-11T16:10:15.143 回答
-3

你检查你的文件是否有结束?>标签?或者更重要的是,它们之后的任何空格......

于 2009-12-22T04:19:13.570 回答