#ajax #performance #codeigniter #session #sleep
Вопрос:
У меня есть одна проблема с сессиями codeignitor. Я создаю один контроллер под названием «Welcome.php» в этом у меня есть три функции. один есть index
, второй home
есть и последний есть getAjaxTestData.
Когда я загружаю контроллер приветствия в браузере (http://localhost:9019/welcome) по умолчанию он вызовет функцию индекса, установит некоторый сеанс и загрузит представление приветствия. В файле представления я отправляю ajax — запрос getAjaxTestData
функции, и в этой функции я устанавливаю режим ожидания на 50 секунд.
Как только запрос ajax вызывается, он ожидает 50 секунд. В то же время, если я открою другую ссылку, вызвав функцию Home link «https://localhost:9019/welcome/home» он не загружается до тех пор, пока не будет выполнен предыдущий запрос ajax.
Это происходит только тогда, когда я устанавливаю сеансы. Если я не устанавливаю сеансы, то даже если я установлю режим сна в функции getAjaxTestData, то https://localhost:9019/welcome/home откроется немедленно.
ниже приведен мой контроллер — можете ли вы, пожалуйста, проверить ..почему другие страницы ожидают загрузки до завершения запроса ajax предыдущей страницы при использовании сеансов? что-нибудь не так?
Код в моем Welcome.php
контроллере
public function index()
{
$newdata = array(
'user_id' => "123",
'username' => "siddu",
);
$this->session->set_userdata($newdata);
session_write_close();
$this->load->view('welcome_message');
}
public function getAjaxTestData()
{
//echo "<pre>";print_r($this->session->userdata);echo "</pre>";die();
sleep(15);
$data=array();
$data['success']=0;
$data['start_time']=date("Y-m-d h:m:s");
$data['end_time']=date("Y-m-d h:m:s");
$data['success']=1;
echo json_encode($data);
die();
}
function Home()
{
$this->load->view('home');
}
Ответ №1:
В вашем коде нет ничего плохого. CodeIgniter перезаписывает библиотеку сеансов, чтобы добавить блокировку по умолчанию, чтобы два HTTP-запроса, использующие один и тот же сеанс, могли выполняться точно в одно и то же время. Ознакомьтесь с документом codeigniter здесь
Ответ №2:
Ответ @Canh правильный.
Недавно я столкнулся с той же проблемой с моим CI3 и исправил ее , расширив библиотеку сеансов и использовав session_write_close
, как рекомендовано в документах, для разблокировки сеанса для всех методов, которые записываются в сеанс, которые я смог найти:
// Relative path: application/libraries/Session/MY_Session.php
class MY_Session extends CI_Session {
public function __construct(array $params = array())
{
parent::__construct($params);
session_write_close();
}
public function mark_as_flash($key)
{
@session_start();
parent::mark_as_flash($key);
session_write_close();
}
public function unmark_flash($key)
{
@session_start();
parent::unmark_flash($key);
session_write_close();
}
public function mark_as_temp($key, $ttl = 300)
{
@session_start();
parent::mark_as_temp($key, $ttl);
session_write_close();
}
public function unmark_temp($key)
{
@session_start();
parent::unmark_temp($key);
session_write_close();
}
public function __set($key, $value)
{
@session_start();
parent::__set($key, $value);
session_write_close();
}
public function set_userdata($data, $value = NULL)
{
@session_start();
parent::set_userdata($data, $value);
session_write_close();
}
public function unset_userdata($key)
{
@session_start();
parent::unset_userdata($key);
session_write_close();
}
public function set_tempdata($data, $value = NULL, $ttl = 300)
{
@session_start();
parent::set_tempdata($data, $value, $ttl);
session_write_close();
}
public function unset_tempdata($key)
{
@session_start();
parent::unset_tempdata($key);
session_write_close();
}
}