2

我有一个 PHP 应用程序,我遇到了一些问题,有些页面需要很长时间才能加载。

几个小时后,我发现了问题,但我不知道如何解决它。

问题似乎出在 header 上Connection: keep-alive。我使用了一个名为“Tamper Data”的 Firefox 插件,它允许您“篡改”标题和内容。一旦我使用该工具将连接标题更改为Connection: close某些页面上的延迟停止。

在 PHP 中,如何确保使用了Connection: close标头?

我尝试将header("Connection: close");PHP 文件放在顶部,然后重新加载页面。它仍然发送Connection: keep-alive标题,而不是我要发送的标题。

我怎样才能实现我想要做的事情?

编辑:我刚刚意识到,在这个子域上,大多数页面根本没有发送 content-length 标头。它仅在表单提交和重定向之后立即发送。

编辑2:

这是页面:http: //volunteer.essentialtransit.com/job/13/just-a-test-at-eta/

单击“立即申请”链接并填写一些随机文本,您不需要附加文件。请注意,当您被重定向回“工作”详细信息页面时,加载需要很长时间。

4

2 回答 2

2

您的问题与连接状态无关。这似乎与连接有关,因为 Apache 会自动为来自不同来源的每个新请求生成一个新的子线程。使用 keep-alive,它将尝试重用前一个线程,该线程正忙于 PHP 脚本(来自您的应用程序)。实际上它有点复杂,但这是基本的。请注意正在发送“连接:关闭”,但它应该仅在脚本完成后关闭连接(发送所有缓冲区)。

现在我要告诉你如何调试你的脚本。我会这样做,因为如果您不解决问题并且获得更多流量,您的主机会因为极端的资源使用而将您踢出去。

所以:

  1. 追加set_time_limit(5)或更高以确认存在后台脚本问题
  2. 检查对本地资源的请求,这些请求只能在你的登台服务器上工作(你可以使用 WireShark)
  3. 检查外部请求、cURL、file_get_contents()调用以及任何超时
  4. 对冗长的脚本进行基准测试和优化(您可以为此尝试 xdebug)
  5. 将所有 PHP 通知、警告和错误记录到文件中;你最多应该得到零错误
  6. 最后,对整个应用程序进行三次检查是一个很好的做法。一是数据录入,二是数据操作,三是模块互联。但是你应该关注不能返回输出的 AJAX 后台脚本

当然,跳过任何不适用的内容。

于 2012-06-16T04:00:09.503 回答
1

因此,我确定了问题所在,并找到了解决此问题的方法。

处理表单的脚本只是处理输入并重定向到另一个页面,但它实际上并没有输出任何内容。在站点上的大多数页面上,内容长度标头要么未发送,要么设置为正确的值。但是由于某种原因,当发布到页面,然后在没有处理脚本向浏览器输出任何内容的情况下进行重定向时,内容长度被设置为 0。

我尝试自己设置内容长度,但运气不佳,因为它似乎没有什么不同。

所以,我所做的只是让处理脚本有一些输出。因此,现在提交表单时,处理脚本会输出一个带有重定向脚本的页面(以及“单击以继续”消息以防万一),该页面会导致正确的页面。因此,虽然这会在表单提交和看到的正确页面之间增加一个非常短暂的延迟,但它会导致正确设置内容长度并解决问题。

虽然这不是一个理想的解决方案,但它是可管理的并且可以使脚本正常工作。

于 2012-06-17T03:23:42.117 回答