意外连接重置:是 PHP 还是 Apache 的问题?

10

我有一个PHP脚本,每次都停在同一个位置,我的浏览器报告:

页面加载时与服务器的连接被重置。

我已经在Firefox和IE上测试过了,都是同样的情况。所以,我猜这是一个Apache/PHP配置问题。以下是我设置的一些内容。

PHP.ini

max_execution_time = 300000 
max_input_time = 300000
memory_limit = 256M 

Apache(httpd.conf)

Timeout 300000
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 0

上述内容正确吗?可能是什么原因导致这种情况,我能设置什么吗?

我在运行Windows Server 2003操作系统上的Apache (2.2),模块为PHP(5.2.12.12)。

由于各种浏览器都有同样的问题,所以很可能是Apache或PHP问题。我认为脚本会运行恰好10分钟(600秒)。


1
我认为在它停止的那一点上,它正在使用SQLCMD实用程序执行一个SQL脚本。这个脚本大约有500行,而且这就是它所做的全部。每一行都是使用SQLCMD运行SQL脚本的调用,我想知道为什么它会在那里失败,因为它已经做了大约300次了。顺便说一下,日志中没有任何信息!! :( - Abs
日志里什么也没有,这包括Web服务器、PHP和SQL服务器的日志吗? - VolkerK
1
是的,所有的都要记录。有趣的是,在Apache的“access.log”中,记录了一切,除了那个经常超时的脚本。Apache是在脚本完成之后还是之前记录这个超时事件的呢? - Abs
你如何执行sqlcmd实用程序?你使用像“-Q”这样的参数来确保sqlcmd在完成后退出吗?使用sqlcmd是必要的吗?还有一些php模块可以在php内部与SQL服务器通信。 - VolkerK
你是否检查了你的PHP错误日志(在php.ini中的error_log)?Apache在请求完成后记录日志,因为它需要记录HTTP状态码和内容长度。 - Kenney
显示剩余4条评论
8个回答

3

我曾经遇到过类似的问题 - 结果发现apache2一直在出现段错误。造成段错误的原因是Ubuntu 10.04 LTS上的php5-xdebug 5.3.2-1ubuntu4.14。移除xdebug后问题得到解决。


我没有安装php5-xdebug,但我遇到了apach2分段错误(11)的相同问题。可能原因不仅是php5-debug。 - Bhargav Nanekalva
这里也有类似的问题 - 在Bitnami上运行Apache2和PHP 7.3.0 x64 TS,使用XDebug 2.7.Obetal。禁用扩展程序可以解决该问题。 - Leon Willens

1
今天我也遇到了这个问题,结果发现是PHP代码中一个漂泊的break;语句(不在任何switch或循环之内),在一个带有try...catch...finally块的函数中。
看起来PHP在这种情况下会崩溃:
<?php

function a ()
{
    break;

    try
    {
    }
    catch (Exception $e)
    {
    }
    finally
    {
    }
}

这是在PHP 5.5.5版本中的情况。


我曾经遇到过完全相同的问题,但是原因是另一种“奇怪”的代码,例如'if ($a[]) $b = $c;'。一旦删除它,一切都正常工作了。似乎PHP解析器有时无法从错误的代码中恢复过来。 - karpy47

1

问题的根本原因是我使用了两个不同的PHP配置。我的应用程序基于NuSOAP库。

在PHP 5.2的配置1上,由于PHP的SOAP扩展被关闭,它可以正常运行。

在PHP 5.3的配置2上,由于PHP的SOAP扩展被打开,它会出现“连接重置”错误。

关闭扩展后,我的应用程序可以在PHP 5.3上运行,而无需重写所有内容。


1
我遇到了一个问题,即在某些情况下 PHP 5.4 + eAccelerator = 连接重置。 在任何日志文件中都没有错误输出,并且仅在某些网址上发生,这使得诊断变得困难。 原来它只发生在某些特定的 PHP 代码/文件上,并且是由于特定的 PHP 代码与 eAccelerator 不兼容。 最简单的解决方案是通过在 .htaccess 文件中添加以下内容来禁用该特定站点的 eAccelerator:

php_flag eaccelerator.enable 0

php_flag eaccelerator.optimizer 0

(或 php.ini 中等效的行):

eaccelerator.enable="0"

eaccelerator.optimizer="0"


1

我知道这是一篇旧文章,但由于我无法在任何地方找到解决我的问题的方法并已经解决了它,所以我想分享一下我的经验。 我的问题的主要原因是调用 file_exists() 函数。
文件实际上存在,但由于某些原因,在文件位置上多了一个斜杠(“//”),这在正常浏览器上通常是可以工作的,但在 PHP 中似乎不起作用。也许你的问题与类似的事情有关。希望这能帮助到某个人!


0

我建议尝试设置所有的错误报告选项:

-b 在发生错误时批量终止
-V 严重程度级别
-m 错误级别

并将所有输出发送到客户端。

<?php
echo "<div>starting sql batch</div>\n<pre>"; flush();
passthru('sqlcmd -b -m -1 -V 11 -l 3 -E -S TYHSY-01 -d newtest201 -i "E:\PHP_N\M_Create_Log_SP.sql"');
echo '</pre>done.'; flush();

谢谢您提供的信息,但我认为我会把那个作为最后的选择,因为那些更改需要我花费一些时间来完成!我刚刚确认这不是PHP的问题,因为PHP脚本的最后一行只是一个提示。唯一剩下的就是Apache了吗? - Abs
执行这个测试脚本真的很难吗?或者至少复制现有脚本,将exec()替换为passthru()并添加两个echo行?这只是一个测试而已。 - VolkerK
刚试了一下,但上面的方法对我根本没用。我得到了一个直接的NT-Authority/System登录被拒绝的错误信息? - Abs
是的,我使用完全相同的命令。我将尝试不使用“-l”。是的,PHP将作为Apache进程运行,并且在使用exec函数时没有引起任何问题。 - Abs
不,即使删除了“-l”,我仍然只能得到直接的访问被拒绝错误。如果它返回“按回车键继续”,那该怎么办?这是什么意思?这是否意味着SQLCMD不存在,而PHP只是在等待无用的东西,因此超时? - Abs
显示剩余7条评论

0
我的PHP程序出现了段错误,但没有任何其他关于原因的信息。后来发现是两个类相互调用了各自的魔术方法__call(),因为它们都没有被调用的方法。PHP会一直循环直到内存耗尽。但它没有报告通常的“内存大小超过*字节”的消息,可能是因为这些方法是“魔法”方法。

0

我想分享一下我的经验。

我也曾遇到同样的错误信息,原因是由于异常中的PHP错误

罪魁祸首是一个自定义的异常类,在内部执行了某些日志记录操作,但这个记录机制发生了致命错误。这导致异常没有像预期那样被触发,且也没有显示任何有意义的信息。


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