Проблема с запуском сеанса и загрузкой страницы

#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();
    }
}