意外的连接重置: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 openssl_public_encrypt 导致页面超时/连接重置?
如何修复XAMPP“Apache / mysql意外关闭”错误