我有以下的senario
正在加载页面A并启动3个ajax调用,它们需要一些时间,因为他们正在努力获取大量数据,尽管服务器无法处理。现在,用户在ajax调用完成之前重定向到页面B.我知道他们会继续在后台运行,但这可能导致显着的加载时间吗?没有sql过热,服务器处理器只使用其约10%的限制。然而,加载时间可以从1-2秒到50秒不等。
这是否可能是由以前的,但正在运行的ajax调用导致的,并且浏览器在某种程度上仍然与这些调用建立连接并在加载下一页之前等待响应?
答案 0 :(得分:0)
根据您在评论部分中的答案,我尝试解释它并为此提供解决方案 - 因为我在此问题中运行了很多次 - 尽管您写道您的ajax调用未使用会话库 - 请查看无论如何,如果你开始它。
默认情况下,PHP会将会话数据写入文件。如果请求开始,则启动会话。此会话文件已锁定。这意味着如果您的网页向PHP脚本发出大量请求,例如通过Ajax加载内容,每个请求都会锁定会话并阻止其他请求完成。
我们为防止这种情况所做的工作如下:
在/application/config/hooks.php
中$hook['pre_controller'][] = array(
"class" => "AppSessionInterceptor",
"function" => "initialize",
"filename" => "AppSessionInterceptor.php",
"filepath" => "hooks"
);
之后创建一个名为AppSessionInterceptor的挂钩
class AppSessionInterceptor
{
private $ci;
public function __construct()
{
$this->ci = &get_instance();
}
public function initialize()
{
//some doings
$this->closeSession();
}
private function closeSession()
{
$blnSessWriteClose = true;
$arrStopSessionFromWriteClose = array(
$this->ci->uri->segment(1) => array("logout","login"),
$this->ci->uri->segment(2) => array("logout","login"),
$this->ci->input->get("blnWriteSession") => array(1)
);
foreach($arrStopSessionFromWriteClose AS $key => $arrValue)
{
if (in_array($key, $arrValue))
{
$blnSessWriteClose = false;
break;
}
}
if ($blnSessWriteClose) session_write_close();
}
}
这会在调用其他任何内容之前关闭会话。 请记住,如果您关闭会话 - 您可以阅读数据但不能再写它了。