Сессии, не работающие в localhost, но работающие на реальном сервере (Codeigniter)

Я столкнулся с этим вопросом со вчерашнего дня, и все же я не мог этого разрешить. Проблема заключается в том, что сеансы не работают в локальной среде, но когда для целей тестирования я помещаю те же файлы на живой сервер, они работают нормально.

Вот если мой файл config.php :

$config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = 'ci_sessions'; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; $config['sess_regenerate_destroy'] = FALSE; $config['cookie_prefix'] = ''; $config['cookie_domain'] = ''; $config['cookie_path'] = '/'; $config['cookie_secure'] = FALSE; $config['cookie_httponly'] = FALSE; 

Вот как я сохраняю данные в одном из своих файлов модели

 $this->session->set_userdata('user',$result); //$result works fine, it produces right result 

На мой взгляд, я попытался получить доступ к этому:

 $this->session->userdata['user']['name']; //name here is an element in result array 

Я получаю эту ошибку:

Уровень важности: уведомление

Сообщение: Неопределенный индекс: пользователь

Имя файла: home / home.php

Номер строки: 2

К моему удивлению, этот же код работает без ошибок на сервере.

Кроме того , чтобы знать данные, сохраняемые сеансами Codeigniter, я попробовал метод базы данных.

Я изменил код ниже в файле config.php

 $config['sess_driver'] = 'database'; $config['sess_cookie_name'] = 'ci_sessions'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = 'ci_sessions'; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; 

Вместо того, чтобы вставлять один ряд данных, он вставляет четыре. См. Снимок экрана из базы данных (последние четыре строки).

Скриншот базы данных

Может ли кто-нибудь указать на ошибку? Любая помощь будет оценена.

У вашего вопроса несколько частей, я отвечу каждому по очереди.

Что касается получения значений из сеанса

userdata() – метод. То, как вы обращаетесь к нему, относится к нему как к массиву:

 $this->session->userdata['user']['name']; // Bad 

Как описано в документах , вы должны передать ключ значения, которое вы хотите получить в качестве параметра для метода userdata :

 $user = $this->session->userdata('user'); // Now you can echo $user['name']; 

Еще проще использовать новый синтаксис:

 $user = $this->session->user; // Now you can echo $user['name']; 

Что касается 4 записей сеанса в базе данных

Проверьте поля timestamp . Они показывают 3 разных раза, а это три отдельных события на сайте. Первое происходит в 1501911275 , затем через 6 секунд появляются еще 2 записи, а затем через 139 секунд последняя запись. Они представляют собой 3 отдельных запроса на сайт – возможно, вы посещали разные страницы, или тестирование и перезагрузку.

Что касается того, почему существует несколько записей, это потому, что идентификатор сеанса периодически регенерируется. Точно как часто это происходит, зависит от вашей конфигурации, см. sess_time_to_update конфигурации sess_time_to_update . Как часто они уничтожаются, также зависит от вашего sess_regenerate_destroy (см. sess_regenerate_destroy в том же разделе документации), но обычно старые записи сеанса сохраняются некоторое время и позже очищаются сбором мусора. Поэтому, пока у вас есть только 1 «текущая» запись сеанса, старые записи могут сохраняться некоторое время.

Что касается вашего sess_save_path

Из формулировки вашего вопроса, я думаю, вы хотите использовать драйвер сеанса files и только попробовали драйвер database для тестирования. Если это правильно, в конфигурации сеансов файлов есть проблема, которую вы должны исправить.

Согласно документам :

поддерживаются только абсолютные пути для $ config ['sess_save_path'].

Комментарии в config/config.php также говорят:

ПРЕДУПРЕЖДЕНИЕ: Поддерживаются только абсолютные пути!

Ваша конфигурация указывает, что данные сеанса должны быть сохранены в ci_sessions , что не является абсолютным путем:

 $config['sess_save_path'] = 'ci_sessions'; // Bad 

Я не уверен, как будет интерпретироваться, но я думаю, что каталог не будет существовать, и у веб-сервера не будет прав на его создание. Я не могу представить, почему он работает на вашем реальном сервере.

Измените путь на абсолютный путь и убедитесь, что ваш веб-сервер может писать на него. Опять из документов

 mkdir /<path to your application directory>/sessions/ chmod 0700 /<path to your application directory>/sessions/ chown www-data /<path to your application directory>/sessions/ 

(сменить www-data пользователю, на котором работает ваш веб-сервер). А потом:

 $config['sess_save_path'] = '/<path to your application directory>/sessions/'; 

Если вы прочитаете ссылку класса setuserdata ожидает, что вторым аргументом будет значение, то в случае, если первым аргументом является ключ, следовательно, ошибка.

с помощью Codeigniter, вы не сможете достичь того, чего хотите, поскольку он использует:

установить следующим образом:

$result=array('name'=>'john doe');

$this->session->set_userdata($result); или $this->session->set_userdata('name','john doe');

сделайте так:

echo $this->session->userdata(['name']);

с другой стороны, используя vanilla php $_SESSION вы можете добиться этого так:

set: $_SESSION['user']=$result;

get: echo $_SESSION['user']['name'];

о $ _SESSION в php manual

заметка:

К моему удивлению, этот же код работает без ошибок на сервере.

это связано с настройкой « ENVIRONMENT , так как на сервере выпуска (live) имеется ограничение на error_reporting . Это устанавливается в корневой index.php .

change define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development'); to: define('ENVIRONMENT', 'production'); и вы также не увидите ошибку на вашем локальном хосте.

Обновить:

Фактически $this->session->set_userdata('name', $name); работает, но функция userdata () принимает только один аргумент и ожидает, что это будет строка

если вы заглянете в библиотеку сессий (/system/libraries/Session/Session.php), вы найдете ее рядом со строкой 747:

 /** * Userdata (fetch) * * Legacy CI_Session compatibility method * * @param string $key Session data key * @return mixed Session data value or NULL if not found */ public function userdata($key = NULL) { if (isset($key)) { return isset($_SESSION[$key]) ? $_SESSION[$key] : NULL; } elseif (empty($_SESSION)) { return array(); } $userdata = array(); $_exclude = array_merge( array('__ci_vars'), $this->get_flash_keys(), $this->get_temp_keys() ); foreach (array_keys($_SESSION) as $key) { if ( ! in_array($key, $_exclude, TRUE)) { $userdata[$key] = $_SESSION[$key]; } } return $userdata; } 

Следуйте этим

В config.php

 Set $config['sess_save_path'] = NULL; 

Как вы сказали $this->session->set_userdata('user',$result); //$result works fine, it produces $this->session->set_userdata('user',$result); //$result works fine, it produces выше $result shoulb, как это

 $result = array( 'user' => 'Ab', ..... 'logged_in' => TRUE ); 

Как получить доступ к ключу сеанса

 echo $this->session->userdata('user'); 

или

 $user = $this->session->userdata('user'); echo $user; 

Кажется, проблема была в PHP версии 7.1, поскольку CI 3.1.6 не поддерживал эту версию PHP.

Я не уверен, что это правильное объяснение, но когда я вернулся к PHP версии 5.6, все стало работать совершенно нормально.

Я думаю, проблема с доступом к данным сеанса с неправильным синтаксисом. Вы можете использовать синтаксис ниже для установки данных сеанса и получения данных сеанса.

Пример для набора данных сеанса

 $session_data = array('name' => "kiran"); $this->session->set_userdata('user', $session_data); 

Пример получения хранимых данных сеанса

 $this->session->userdata('user')['name']; 
 $config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = NULL; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; 

$ config ['sess_regenerate_destroy'] = FALSE;

.htaccess

 DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php?/$1 [ 

L, QSA]