【问题标题】:Unexpected Connection Reset: A PHP or an Apache issue?意外的连接重置:PHP 或 Apache 问题?
【发布时间】:2010-12-30 04:33:53
【问题描述】:

我有一个 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

以上说的对吗?是什么原因造成的?我可以设置什么?

我正在运行 PHP (5.2.12.12) 作为 Windows 上 Apache (2.2) 上的模块 服务器 2003。

这很可能是 Apache 或 PHP 问题,因为所有浏览器都在做同样的事情。我认为脚本运行正好 10 分钟(600 秒)。

【问题讨论】:

  • 脚本停止时在做什么?
  • 我认为它停止时,它使用 SQLCMD 实用程序执行 SQL 脚本。该脚本大约有 500 行,仅此而已。每一行都是使用 SQLCMD 运行 SQL 脚本的调用,我想知道为什么它在那里失败了,因为它已经完成了大约 30000 次。顺便说一句,日志中也没有任何内容! :(
  • “顺便说一句,日志中也没有任何内容!” - 包括webserver、php和sqlserver的日志?
  • 是的。有趣的是,在 Apache 的“access.log”中。除了不断超时的脚本外,所有内容都被记录下来。 Apache 什么时候记录这个,在脚本完成之后还是之前?
  • 您如何执行 sqlcmd 实用程序?您是否使用 -Q 之类的参数来确保 sqlcmd 在完成后退出?有必要使用sqlcmd吗?有一些 php 模块可以“从内部”php 与 SQL 服务器通信。

标签: apache connection php httpd.conf


【解决方案1】:

我遇到了类似的问题 - 原来 apache2 出现了段错误。段错误的原因是 Ubuntu 10.04 LTS 上 5.3.2-1ubuntu4.14 的 php5-xdebug。删除 xdebug 解决了这个问题。

【讨论】:

  • 我没有安装 php5-xdebug 但我遇到了同样的 apach2 分段错误问题 (11)。可能是原因不同而不仅仅是php5-debug。
  • 17.01.2019 类似问题 - 在 Bitnami、XDebug 2.7.Obetal 上使用 PHP 7.3.0 x64 TS 运行 Apache2。禁用扩展程序可以解决问题。
【解决方案2】:

我今天也遇到了这个问题,原来是 PHP 代码中的一个流浪的 break; 语句(在任何开关或任何循环之外),在一个带有 try...catch...finally 块的函数中。

在这种情况下,PHP 似乎崩溃了:

<?php

function a ()
{
    break;

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

这是 PHP 版本 5.5.5。

【讨论】:

  • 有完全相同的问题,但由另一种类型的“奇怪”代码引起,例如'if ($a[]) $b = $c;'。删除后,一切正常。似乎 PHP 解析器有时无法从错误代码中恢复。
【解决方案3】:

2 个 PHP 配置之间的差异确实是我的问题的根本原因。我的应用基于 NuSOAP 库。

在 PHP 5.2 的配置 1 上,由于 PHP 的 SOAP 扩展关闭,它运行良好。

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

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

【讨论】:

    【解决方案4】:

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

    php_flag eaccelerator.enable 0

    php_flag eaccelerator.optimizer 0

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

    eaccelerator.enable="0"

    eaccelerator.optimizer="0"

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我会尝试设置所有错误报告选项

        -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??
        • 和 SQL 服务器(但我不认为这可以重置连接,对吧?)。
        • 运行这个测试脚本真的那么难吗?或者至少要复制现有脚本,用 passthru() 替换 exec() 并添加两个 echo 行?这只是一个测试。
        • 我对 exec 的使用随处可见,这不是一个容易的改变。另外,我有 SQL Server Management Studio,它应该记录所有发生的错误,所以如果有错误,我应该在那里看到它。其次,SQL Server 不太可能导致浏览器报告连接重置。如果 SQL 服务器发生任何事情,PHP 会知道并且 PHP 会报告这一点,而不是浏览器!对吗?
        • 顺便说一句,我没有拒绝你的帮助! :) 我现在正在尝试!
        【解决方案7】:

        我的 PHP 也出现了段错误,但没有任何关于其原因的额外信息。原来是两个类调用彼此的神奇 __call() 方法,因为它们都没有被调用的方法。 PHP 只是循环,直到内存不足。但它没有报告通常的“Allowed memory size of * bytes exhausted”消息,可能是因为这些方法很“神奇”。

        【讨论】:

          【解决方案8】:

          我想我也会添加我自己的经验。

          我收到了同样的错误消息,在我的情况下是由 异常中的 PHP 错误引起的。

          罪魁祸首是一个自定义异常类,它在内部进行了一些日志记录,并且在该日志记录机制中发生了致命错误。这导致异常没有按预期触发,也没有显示任何有意义的消息。

          【讨论】:

            猜你喜欢
            • 2011-12-24
            • 1970-01-01
            • 2013-04-05
            • 2011-06-30
            • 1970-01-01
            • 2019-12-10
            • 2012-01-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多