000webhost部署后出现ini_set会话警告,本地正常求助
遇到PHP错误
级别:警告
消息:ini_set(): A session is active. You cannot change the session module's ini settings at this time
文件路径:Session/Session.php
行号:282
回溯信息:
文件:/storage/ssd2/495/19547495/public_html/application/controllers/Auth.php
行号:8
函数:__construct
文件:/storage/ssd2/495/19547495/public_html/index.php
行号:316
函数:require_once
本地环境运行完全正常,但部署到000webhost后触发上述警告,导致网站无法正常访问。
相关代码片段
Session.php(报错行附近代码)
isset($params['cookie_name']) OR $params['cookie_name'] = config_item('sess_cookie_name'); if (empty($params['cookie_name'])) { $params['cookie_name'] = ini_get('session.name'); } else { ini_set('session.name', $params['cookie_name']); } isset($params['cookie_path']) OR $params['cookie_path'] = config_item('cookie_path'); isset($params['cookie_domain']) OR $params['cookie_domain'] = config_item('cookie_domain'); isset($params['cookie_secure']) OR $params['cookie_secure'] = (bool) config_item('cookie_secure'); session_set_cookie_params( $params['cookie_lifetime'], $params['cookie_path'], $params['cookie_domain'], $params['cookie_secure'], TRUE // HttpOnly; Yes, this is intentional and not configurable for security reasons );
Auth.php(构造函数部分)
<?php defined('BASEPATH') or exit('No direct script access allowed'); class Auth extends CI_Controller { public function __construct() { parent::__construct(); $this->load->library('form_validation'); $this->load->model('Auth_model'); }
index.php(加载引导文件部分)
define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR); /* * ------------------------------------------------------------------- LOAD THE BOOTSTRAP FILE * ------------------------------------------------------------------- * And away we go... */ require_once BASEPATH.'core/CodeIgniter.php';
解决方法
问题根源是000webhost服务器默认提前激活了Session,而CodeIgniter的Session库初始化时尝试修改Session配置,此时Session已处于激活状态,触发警告。以下是三种可行方案:
方案1:对齐Session名称配置
打开application/config/config.php,找到Session配置项:$config['sess_cookie_name'] = 'ci_session';先在
index.php顶部添加测试代码,查看服务器默认的Session名称:echo ini_get('session.name'); exit;部署后访问网站,记下输出值,将
$config['sess_cookie_name']修改为该值,再删除测试代码。这样Session库不会执行ini_set操作,避免警告。方案2:禁用服务器自动启动Session
在网站根目录创建或修改.htaccess文件,添加以下规则:php_flag session.auto_start off强制关闭服务器自动启动Session的机制,让CodeIgniter完全控制Session初始化流程。
方案3:修改Session库代码(不推荐,会影响框架升级)
找到Session/Session.php的报错代码块,在执行ini_set前判断Session是否已激活:else { if(session_status() !== PHP_SESSION_ACTIVE) { ini_set('session.name', $params['cookie_name']); } }仅当Session未激活时修改配置,规避警告触发条件。
内容的提问来源于stack exchange,提问作者Muhaemin Nurhidayat

