PHP连接:关闭

时间:2012-06-16 03:14:02

标签: php http-headers connection

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

经过几个小时我发现了问题,但我不知道如何修复它。

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

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

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

我如何实现我想要做的事情?

编辑:我刚刚意识到,在这个子域中,大多数页面都不会发送内容长度标题。它仅在表单提交后发送,然后重定向。

编辑2:

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

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

2 个答案:

答案 0 :(得分:2)

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

现在我要告诉你如何调试你的脚本。我会这样做是因为如果你没有解决问题而且你获得了更多的流量,你的主机会把你踢出去以便极少使用资源。

所以:

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

答案 1 :(得分:1)

所以,我确定了问题所在,并找到了解决这个问题的方法。

处理表单的脚本只是处理了输入并重定向到另一个页面,但它实际上没有输出任何内容。在网站上的大多数页面上,内容长度标题未发送,或者设置为正确的值。但由于某些原因,当发布到页面,然后重定向而没有处理脚本向浏览器输出任何内容时,内容长度设置为0。

我尝试自己设置内容长度,但没有太多运气,因为它似乎没有什么区别。

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

虽然这不是一个理想的解决方案,但它是可管理的,并使脚本有效。