Сессии, не работающие в 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
Я получаю эту ошибку:
Уровень важности: примечание
Сообщение: Undefined index: пользователь
Имя файла: 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;
Вместо того, чтобы вставлять одну строку данных, она вставляет четыре. Пожалуйста, смотрите снимок экрана из базы данных (последние четыре строки).
![Скриншот базы данных]()
Может ли кто-нибудь указать на ошибку? Любая помощь будет оценена.
Ответы
Ответ 1
В вашем вопросе есть несколько частей, я отвечу каждому по очереди.
Относительно получения значений из сеанса
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_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/';
Ответ 2
Если вы читаете Ссылка класса Codeigniter setuserdata
ожидает, что вторым аргументом будет значение, которое в случае, если первым аргументом является ключ, следовательно, ошибка.
с помощью Codeigniter, вы не сможете достичь того, что хотите, поскольку оно использует:
set следующим образом:
$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;
получить: echo $_SESSION['user']['name'];
см. о $_SESSION в руководство php
Примечание:
К моему удивлению, этот же код работает без ошибок на сервере.
это связано с настройкой ENVIRONMENT
, так как у вас есть error_reporting
ограниченный на рабочем (живом) сервере. Это устанавливается в корневом каталоге index.php
.
измените define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
на: 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;
}
Ответ 3
Следуйте этим
В файле config.php
Set $config['sess_save_path'] = NULL;
Как вы сказали, $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;
Ответ 4
Кажется, проблема была в PHP версии 7.1, поскольку CI 3.1.6 не поддерживал эту версию PHP.
Я не уверен, что это правильное объяснение, но когда я вернулся к PHP версии 5.6, все стало работать нормально.
Ответ 5
Я думаю, проблема с доступом к данным сеанса с неправильным синтаксисом. Вы можете использовать ниже синтаксис для установки данных сеанса и получения данных сеанса.
Пример набора данных сеанса
$session_data = array('name' => "kiran");
$this->session->set_userdata('user', $session_data);
Пример получения хранимых данных сеанса
$this->session->userdata('user')['name'];
Ответ 6
$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]
Ответ 7
Я выполняю много научно-исследовательских работ, но проблема не решена, но внезапно я проверил свою версию MySQL, и когда я изменю свою версию SQL, она будет работать. Если у вас возникла такая проблема, вы можете проверить свою версию, чтобы получить результат.