Codeigniter 会话不适用于 PHP 7
Posted
技术标签:
【中文标题】Codeigniter 会话不适用于 PHP 7【英文标题】:Codeigniter session is not working on PHP 7 【发布时间】:2018-01-27 02:58:15 【问题描述】:我在 PHP 5.6 上使用 codeigniter 版本 3.0.6,它运行良好。但是当我在 PHP 7.1 上运行相同的项目时,codeigniter 会话不起作用。我如下设置会话
$login_session = $this->session->set_userdata("user_session",$session_data);
当我打印 $login_session 在 php 7 上它是空白的
【问题讨论】:
***.com/questions/43718961/… 您检查过Bug 问题吗? github.com/bcit-ci/CodeIgniter/issues/4830 这里是解决方案检查它是否有效:jianshu.com/p/4bf22c8af19d 它的中国老兄 升级到 3.1.5 【参考方案1】:最近我将 php 版本从 5.6 升级到 7.1 时遇到了同样的问题 我的开发环境是使用php7.1.4的XAMPP(Apache + MariaDB)
请按照以下步骤操作:
1) 进入system/libraries/Session/Session.php
2) 通过添加 // 来注释 session_start()。
3) 转到 312-315 附近的行,其中说安全为王,并注释掉以下行:
ini_set('session.use_trans_sid', 0);
ini_set('session.use_strict_mode', 1);
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 4);
4) 然后转到你的主 index.php(根 index.php)
5) 在顶部添加一次 session_start()。
它对我有用。
【讨论】:
谢谢兄弟!有效。希望这不会破坏任何安全权利? 厕所。不,它不会破坏任何安全问题。 你拯救了我的一天,但我花了 5 个小时才找到它,谢谢你,非常感谢! 这不是一个好的答案。它会工作,但问题是使用的 Codeigniter 版本。检查@Siddesh 的答案。 我在这个问题上花了将近 6 个小时,终于解决了谢谢@Shafiq 兄弟【参考方案2】:php 7.1 中的会话 id 不同,未通过正则表达式检查。
一个简单的修复: 在 system/libraries/Session/Session.php arround line 133
OR ! preg_match('/^[0-9a-f]40$/', $_COOKIE[$this->_config['cookie_name']])
删除“40$”
OR ! preg_match('/^[0-9a-f]/', $_COOKIE[$this->_config['cookie_name']])
问题是由于正则表达式不匹配,会话 ID 已从 cookie 中删除。所以会话 id 总是更新。
这可以修复正则表达式并防止它运行该行 "未设置($_COOKIE[$this->_config['cookie_name']]);"
它完全适合我!
仅供参考。我自己修好后找到这个。 https://github.com/bcit-ci/CodeIgniter/issues/4830
【讨论】:
如果您不想更新 codeigniter 或任何其他东西,最好的解决方案 这是最好的解决方案,而不是像顶部答案那样编辑 2 个文件 这个解决方案简直完美,但我需要知道,它会导致任何安全问题吗? 似乎不会导致安全问题,因为它只是去掉了长度检查。如果会话id不匹配,它仍然没有通过检查【参考方案3】:我提出以下步骤:
-
转到https://www.codeigniter.com,下载最新的3.x.x版本的框架并解压。
在现有应用中复制系统文件夹,将其保存在其他位置,然后删除应用文件夹中的那个。
复制您刚刚下载的系统文件夹,并将其放在您删除最后一个文件夹的位置。
完成!
这可以无缝地解决问题,节省您的时间以及将您的应用搞砸的潜在风险。
【讨论】:
这是解决这个问题的最佳答案【参考方案4】:我发现问题出在一些早期版本的 Codeigniter 3 上,这是他们网站上已经报告的错误。该错误已得到修复,并且在最新版本的 Codeigniter 3 中不会发生此问题。
如果您已经使用了错误版本的 cogeinter,请考虑将系统文件夹替换为最新版本的文件夹。
找到这个答案here
【讨论】:
这是复制的答案并在上面的线程中给出。你为什么要复制这个而不是给出 URL? 因为该网站的文章可能不再可用。【参考方案5】:按照这些步骤,我设法克服了这个问题。
1) 转至system/libraries/Session/Session.php
2) 通过添加 // 搜索 session_start()
评论 session_start()
。
3) 下到 312 附近的行(或搜索 Security is king
)并注释掉所有 ini_set()
ini_set('session.use_trans_sid', 0);
ini_set('session.use_strict_mode', 1);
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 4);
4) 然后转到你的主 index.php(根 index.php)
5) 在顶部添加session_start()
。
6) 在session_start()
下方添加Session.php
中注释的以下行
ini_set('session.use_trans_sid', 0);
ini_set('session.use_strict_mode', 1);
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 4);
就是这样。
【讨论】:
好的,谢谢你这工作,但警告:ini_set():会话处于活动状态。此时您无法在第 3 行的 index.php 中更改会话模块的 ini 设置 恕我直言...更改系统文件的形式真的很糟糕。【参考方案6】:确保您已设置会话保存路径
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = APPPATH . 'cache/session/';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
设置文件夹权限0700
根据需要自动加载会话
$autoload['libraries'] = array('session');
如何设置会话
$session = array('islogged' => true, 'user_id' => '1');
$this->session->set_userdata($session);
获取用户数据一组示例
echo $this->session->userdata('user_id');
if (!$this->session->userdata('islogged'))
redirect('logout');
【讨论】:
【参考方案7】:将 Codeigniter 升级到最新版本。 问题将得到解决。
【讨论】:
【参考方案8】:你只需要进入application/config/config.php
这个文件并设置会话路径
$config['sess_save_path'] = sys_get_temp_dir();
这将解决您的问题。
【讨论】:
【参考方案9】:我也遇到了同样的问题,浪费了一整天。 这是简单的解决方案。
只需下载CodeIgniter 3.1.11版本并复制系统文件夹并将系统文件夹替换为您的旧系统文件夹
【讨论】:
【参考方案10】:问题出在你的 PHP 版本上,PHP 7.1 不是很稳定,而且会话有很多问题。将您的 PHP 版本更改为 7.0,会话将自动开始工作。
【讨论】:
请解释下投票 我最近从 php5.6 切换到 php7.1。会话立即停止工作。这个建议是唯一对我有用的东西。重新安装 codeigniter 核心并检查我的会话配置没有帮助。但是,我有几个版本的 PHP 可用,当我从 7.1 切换到 7.0 时,我的会话再次工作。以上是关于Codeigniter 会话不适用于 PHP 7的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter 4 不适用于带有 PHP 8.0 的 xampp
Codeigniter 删除 index.php 在本地工作,但不适用于 aws ELB