Сессии, не работающие в 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, она будет работать. Если у вас возникла такая проблема, вы можете проверить свою версию, чтобы получить результат.