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

Posted

技术标签:

【中文标题】意外的连接重置:PHP 或 Apache 问题?【英文标题】:Unexpected Connection Reset: A PHP or an Apache issue? 【发布时间】: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 服务器通信。 【参考方案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 错误引起的。

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

【讨论】:

以上是关于意外的连接重置:PHP 或 Apache 问题?的主要内容,如果未能解决你的问题,请参考以下文章

PHP解析错误导致连接重置

Apache HttpClient 4.5:连接重置

PHP openssl_public_encrypt 导致页面超时/连接重置?

如何修复XAMPP“Apache / mysql意外关闭”错误

HTML5 / PHP WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:200

Apache 或 php 丢失了我的 post 参数