Я обновляю приложение с CodeIgniter 2.2.1 до 3.1.8. Приложение аутентифицирует пользователей и сохраняет состояние аутентификации в сеансе, и после обновления, которое прервалось, и пользователи больше не могут войти в систему. Я использую PHP версии 7.1.12 через PHP-FPM на nginx на виртуальной машине Linux.
Я потратил лучшую часть 1,5 дней, пытаясь разобраться в этом. Насколько я могу судить, все сводится к тому, что PHP не читает идентификатор сеанса, отправляемый браузером через cookie, и создает новый сеанс (и идентификатор сеанса) для каждого запроса. Я могу сказать это по тому факту, что значение ci_session
в файле cookie запроса отличается от значения ci_session
в соответствующем файле cookie ответа (как отображается в Firefox devtools), а также от того, что каждый файл создается каждый раз время. (Я настроил CodeIgniter для использования драйвера файлов.)
При попытке отладки, если я записываю значение session_id()
перед вызовом session_start()
(в /system/libraries/Session/Session.php
, строка 143 ), я просто вижу пустую строку. Сразу после этого я вижу тот же новый идентификатор сеанса, который Firefox показывает в файле cookie ответа.
Я довольно подробно прочитал:
и попробовал следующие средства, но безрезультатно:
- установите PHP
error_reporting
на E_ALL
и проверьте журнал ошибок PHP на наличие сообщений, например. в отношении уже выведенных заголовков
- изменил значение
$config['encryption_key']
на случайную 32-символьную строку, скопированную из раздела CodeIgniter http://randomkeygen.com/
- изменил значение
$config['sess_cookie_name']
на строку, состоящую только из строчных буквенно-цифровых символов
- удостоверился, что файлы сеанса действительно создаются в каталоге
$config['sess_save_path']
, с правильными идентификаторами и информацией
- попытался установить
$config['cookie_domain']
на .domainname.tld
(а также просто ''
)
- прыгнул прямо к CI 3.1.8 (я изначально обновился до 3.0.0 и планировал выполнять инструкции по обновлению для каждого выпуска до 3.1.8. Я этого еще не сделал, вместо этого я просто заменил
/system
папка с версией 3.1.8).
Ниже я вставил все соответствующие настройки из CI и из PHP. Очевидно, я что-то упускаю, вполне возможно, что-то действительно простое. Как я могу диагностировать дальше / исправить?
Настройки CodeIgniter
$config['cookie_prefix'] = "";
$config['cookie_domain'] = "";
$config['cookie_path'] = "/";
$config['cookie_secure'] = FALSE;
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 3600 * 24 * 60; // 60 days
$config['sess_use_database'] = FALSE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_driver'] = 'files';
$config['sess_save_path'] = BASE . 'storage/session';
Настройки PHP
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary wddx
Directive Local Value Master Value
session.auto_start Off Off
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.lazy_write On On
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/opt/remi/php71/lib/php/session /var/opt/remi/php71/lib/php/session
session.serialize_handler php php
session.sid_bits_per_character 5 5
session.sid_length 26 26
session.upload_progress.cleanup On On
session.upload_progress.enabled On On
session.upload_progress.freq 1% 1%
session.upload_progress.min_freq 1 1
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_
session.use_cookies On On
session.use_only_cookies On On
session.use_strict_mode Off Off
session.use_trans_sid 0 0