我有一个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/
点击“立即申请”链接并填写一些随机文本,您无需附加文件。请注意,当您被重定向回“作业”详细信息页面时,需要很长时间才能加载。
答案 0 :(得分:2)
您的问题与连接状态无关。它似乎与连接有关,因为Apache会自动为源自不同源的每个新请求生成一个新的子线程。使用keep-alive,它将尝试重用前一个线程,该线程正忙于PHP脚本(来自您的应用程序)。它实际上有点复杂,但这是基本的。请注意,正在发送“连接:关闭”,但只有在脚本完成后才会关闭连接(发送所有缓冲区)。
现在我要告诉你如何调试你的脚本。我会这样做是因为如果你没有解决问题而且你获得了更多的流量,你的主机会把你踢出去以便极少使用资源。
所以:
set_time_limit(5)
或更高版本以确认存在后台脚本问题file_get_contents()
来电,超时当然,请跳过任何不适用的内容。
答案 1 :(得分:1)
所以,我确定了问题所在,并找到了解决这个问题的方法。
处理表单的脚本只是处理了输入并重定向到另一个页面,但它实际上没有输出任何内容。在网站上的大多数页面上,内容长度标题未发送,或者设置为正确的值。但由于某些原因,当发布到页面,然后重定向而没有处理脚本向浏览器输出任何内容时,内容长度设置为0。
我尝试自己设置内容长度,但没有太多运气,因为它似乎没有什么区别。
所以,我所做的就是让处理脚本有一些输出。因此,现在当提交表单时,处理脚本会输出一个带有重定向脚本的页面(以及以防万一的“单击以继续”消息),从而导致页面正确。因此,虽然这会在表单提交和正确的页面之间添加一个非常短暂的延迟,但它会导致正确设置内容长度并解决问题。
虽然这不是一个理想的解决方案,但它是可管理的,并使脚本有效。