У меня были проблемы с сессиями / файлами cookie в CodeIgniter. После исследования с помощью Inspect Element я понял, что мой код создает новый файл cookie каждый раз, когда я загружаю страницу на своем веб-сайте. Я не могу, хоть убей, понять, как этого избежать / назначить пользователю только один согласованный файл cookie на сеанс.
Мои настройки сеанса таковы:
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_save_path'] = BASEPATH . 'Writable/sessions/';
$config['sess_match_ip'] = True;
$config['sess_time_to_update'] = 120;
$config['sess_regenerate_destroy'] = False;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '.myapp.com';
$config['cookie_path'] = '/';
$config['cookie_secure'] = False;
$config['cookie_httponly'] = False;
Кроме того, я предоставил папке / Writable / sessions / правильные разрешения и права собственности. Я думаю, что моя конфигурация в порядке (файлы cookie отображаются в браузере / похоже, работают).
Тогда мой вопрос: как сделать так, чтобы файл cookie сохранялся в соответствии с индивидуальным пользователем при первом входе в систему вместо создания нового файла cookie с отсутствующими данными каждый раз, когда я загружаю страницу? Мой класс контроллера (где я инициализирую куоки) выглядит так:
BaseController.php
class BaseController extends \CodeIgniter\Controller {
// Class vars set to null
public function __construct($request, $response, $logger = null) {
parent::__construct($request, $response, $logger);
error_reporting(E_ALL);
ini_set('display_errors', 1);
$this->db = \Config\Services::db();
$this->RefTypes = new RefTypesModel($this);
$this->url = new \CodeIgniter\HTTP\URI();
// This is the problematic code
if ($this->session == null) {
$this->session = \Config\Services::session();
$this->session->start();
}
$this->init();
}
}
Затем в других моих контроллерах у меня есть код, который использует сеанс следующим образом:
MyController.php
class MyController extends BaseController {
public function login() {
// Set data in cookie and then redirect to new page
$this->session->set('userId', $userId);
return redirect()->to('/dashboard');
}
public function dashboard() {
// This is where I run into a problem...
$test = $this->session->get('userId'); //Returns null
echo "<script type=\"text/javascript\">alert('$test');</script>";
}
}
По сути, поскольку PHP - это язык сценариев, каждый раз, когда я загружаю новую страницу, запускается код в BaseController.php, который затем запускает код для повторной инициализации сеанса. Я также пробовал использовать драйвер базы данных, но это не помогло. Кто-нибудь знает какие-либо обходные пути для этого или какой-либо способ иметь "общий" экземпляр моей переменной сеанса, чтобы он не зависел от моих контроллеров? Спасибо!! Любая помощь очень ценится :)
Обновлено: мой /application/config/config.php, похоже, не действует. Я думаю, это потому, что я использую CI4 вместо CI3. Я прямо сейчас явно настраивал параметры сеанса. Код для этого выглядит так:
/system/Session/Session.php:
public function __construct(\SessionHandlerInterface $driver, $config) {
$this->driver = $driver;
$config->sessionSavePath = BASEPATH . 'Writable/sessions/';
$config->sessionMatchIP = True;
$config->cookieDomain = '.autoloapp.com';
$this->sessionDriverName = $config->sessionDriver;
$this->sessionCookieName = $config->sessionCookieName;
$this->sessionExpiration = $config->sessionExpiration;
$this->sessionSavePath = $config->sessionSavePath;
$this->sessionMatchIP = $config->sessionMatchIP;
$this->sessionTimeToUpdate = $config->sessionTimeToUpdate;
$this->sessionRegenerateDestroy = $config->sessionRegenerateDestroy;
$this->cookieDomain = $config->cookieDomain;
$this->cookiePath = $config->cookiePath;
$this->cookieSecure = $config->cookieSecure;
}
Я использую CI4, и у меня есть экземпляр / загрузка, как описано выше. Я думал, что, поскольку он был создан автоматически, я смогу полностью избежать этой проблемы, но либо я загружаю его неправильно, либо альфа-версия CI4 плохо работает с сессиями. Любые идеи?
Вы устанавливаете значения конфигурации сеанса и cookie в /application/Config.App.php? Если нет, то как и когда вы предоставляете их конструктору Session?
Кроме того, тест if ($this->session == null) { ожидает, что свойство класса $session существует, в противном случае будет выдано исключение. Как и где вы создаете эту недвижимость?
BASEPATH - это путь к системному каталогу. Ваше значение $sessionSavePath должно быть ROOTPATH . 'writable/sessions/';@DFriend У меня нет файла /application/Config.App.php. Я обновил вопрос, чтобы показать код, который я использую для временного принудительного применения определенных параметров сеанса, хотя это явно не идеально для производственной среды. Я определяю $ this-> session = null; как переменная открытого класса над конструктором. Имеет ли значение расположение / Writable / sessions /? Я думал, что до тех пор, пока разрешения / владение верны, и я прошел абсолютный путь, он будет работать независимо.
Я смотрю новый проект CI4, чтобы попытаться выяснить проблему отсутствия файла конфигурации, он обязательно должен быть там. Я унаследовал этот проект от разработчика, который ушел до того, как проект был завершен, и он проделал менее звездную работу по настройке фреймворка ...






Мне удалось это исправить (наконец), но заменив все файлы / application и все файлы / shared / config на файлы из стандартного фреймворка CI4. Я использовал файлы CI3 (привет разработчикам до меня), и обновление этих файлов конфигурации с правильными значениями устранило проблему. Я также удалил код в BaseController.php, который создавал сеанс. Спасибо @DFriend за помощь в решении проблемы!
Кажется, вы смешиваете CI3 при запуске CI 4. Вы видели CI4 Docs? Он должен автоматически запуститься после вызова службы. bcit-ci.github.io/CodeIgniter4/libraries/…