我有一个 PHP 应用程序,但遇到了一些问题,某些页面需要很长时间才能加载。
几个小时后我发现了问题,但我不知道如何解决它。
问题似乎出在 header Connection: keep-alive
上。我使用了一个名为“Tamper Data”的 Firefox 插件,它允许你“篡改”标题和内容。一旦我使用该工具将连接 header 更改为Connection: close
,某些页面上的延迟就停止了。
在 PHP 中,如何确保使用 Connection: close
header ?
我尝试将 header("Connection: close");
放在 PHP 文件的顶部,然后重新加载页面。它仍然发送 Connection: keep-alive
header ,而不是我尝试发送的 header 。
我怎样才能实现我想要做的事情?
编辑:我刚刚意识到,在这个子域上,大多数页面根本不发送内容长度 header 。它仅在表单提交后立即发送,然后进行重定向。
编辑2:
这是页面:http://volunteer.essentialtransit.com/job/13/just-a-test-at-eta/
单击“立即申请”链接并填写一些随机 txt,无需附加文件。请注意,当您重定向回“作业”详细信息页面时,加载时间将非常长。
最佳答案
您的问题与连接状态无关。它可能看起来与连接有关,因为 Apache 会自动为来自不同源的每个新请求生成一个新的子线程。通过保持事件状态,它将尝试重用先前的线程,该线程因 PHP 脚本(来自您的应用程序)而繁忙。实际上有点复杂,但这是基本的。请注意,正在发送“连接:关闭”,但它应该仅在脚本完成后(发送所有缓冲区)才关闭连接。
现在我将告诉您如何调试脚本。我之所以这样做是因为,如果您不解决问题并获得更多流量,您的主机就会因过度使用资源而将您踢出局。
所以:
- 附加
set_time_limit(5)
或更高版本以确认存在后台脚本问题 - 检查对本地资源的请求,以及仅在您的登台服务器上有效的请求(您可以使用 WireShark 来实现此目的)
- 检查外部请求、cURL、
file_get_contents()
调用以及任何超时的内容 - 对冗长的脚本进行基准测试并优化(您可以为此尝试 xdebug)
- 将所有 PHP 通知、警告和错误记录到文件中;你最多应该得到零错误
- 最后,对整个申请进行三次检查是一个很好的做法。第一个用于数据输入,第二个用于数据操作,第三个用于模块互连。但您应该关注无法返回输出的 AJAX 后台脚本
当然,跳过任何不适用的内容。
关于PHP连接: Close,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11060476/