Error codeigniter generates multiple sessions for the same user - xaiborweb - 12-10-2018
Hello community, I am a novice in this framework. forgive my english I speak spanish and is a google translator. But a project with codeigniter 3.19 and Ion Auth 3 is created as a method of authentication and user registration.
On my local server xampp windows, a session works perfectly for each user. But in my web linux, ubuntu 16.04, vestacp, with cloudflare, I generate 10 sessions every 1 sg we are constantly having a million session records and taking into account that I have very little traffic it is supposed to be an error that creates duplicate session for each user.
session capture in all fields ip_address gives me the ip of my server.
Quote:web where I have the problem with the sessions
tvglu.net
es.tvglu.net
attached configurations, very grateful any help.
Quote:/application/config/config.php
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'cisession';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_session';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
$config['cookie_prefix'] = 'cisession';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
$config['proxy_ips'] = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : '';
Quote:/application/config/autoload.php
$autoload['libraries'] = array('ion_auth');
Quote:tabla base de datos
CREATE TABLE `ci_session` (
`id` varchar(128) NOT NULL,
`ip_address` varchar(45) NOT NULL,
`timestamp` int(10) unsigned NOT NULL DEFAULT '0',
`data` blob NOT NULL,
PRIMARY KEY (`id`),
KEY `ci_sessions_timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
PHP Code: /application/libraries/Ion_auth.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Ion_auth { /** * account status ('not_activated', etc ...) * * @var string **/ protected $status;
/** * extra where * * @var array **/ public $_extra_where = array();
/** * extra set * * @var array **/ public $_extra_set = array();
/** * caching of users and their groups * * @var array **/ public $_cache_user_in_group;
/** * __construct * * @return void * @author Ben **/ public function __construct() { $this->load->config('ion_auth', TRUE); $this->load->library(array('email')); $this->lang->load('ion_auth'); $this->load->helper(array('cookie', 'language','url'));
$this->load->library('session');
$this->load->model('ion_auth_model');
$this->_cache_user_in_group =& $this->ion_auth_model->_cache_user_in_group;
//auto-login the user if they are remembered if (!$this->logged_in() && get_cookie($this->config->item('identity_cookie_name', 'ion_auth')) && get_cookie($this->config->item('remember_cookie_name', 'ion_auth'))) { $this->ion_auth_model->login_remembered_user(); }
$email_config = $this->config->item('email_config', 'ion_auth');
if ($this->config->item('use_ci_email', 'ion_auth') && isset($email_config) && is_array($email_config)) { $this->email->initialize($email_config); }
$this->ion_auth_model->trigger_events('library_constructor'); }
/** * __call * * Acts as a simple way to call model methods without loads of stupid alias' * **/ public function __call($method, $arguments) { if (!method_exists( $this->ion_auth_model, $method) ) { throw new Exception('Undefined method Ion_auth::' . $method . '() called'); } if($method == 'create_user') { return call_user_func_array(array($this, 'register'), $arguments); } if($method=='update_user') { return call_user_func_array(array($this, 'update'), $arguments); } return call_user_func_array( array($this->ion_auth_model, $method), $arguments); }
/** * __get * * Enables the use of CI super-global without having to define an extra variable. * * I can't remember where I first saw this, so thank you if you are the original author. -Militis * * [MENTION=178865]Access[/MENTION] public * @param $var * @return mixed */ public function __get($var) { return get_instance()->$var; }
/** * forgotten password feature * * @return mixed boolian / array * @author Mathew **/ public function forgotten_password($identity) //changed $email to $identity { if ( $this->ion_auth_model->forgotten_password($identity) ) //changed { // Get user information $user = $this->where($this->config->item('identity', 'ion_auth'), $identity)->where('active', 1)->users()->row(); //changed to get_user_by_identity from email
if ($user) { $data = array( 'identity' => $user->{$this->config->item('identity', 'ion_auth')}, 'forgotten_password_code' => $user->forgotten_password_code );
if(!$this->config->item('use_ci_email', 'ion_auth')) { $this->set_message('forgot_password_successful'); return $data; } else { $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_forgot_password', 'ion_auth'), $data, true); $this->email->clear(); $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); $this->email->to($user->email); $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_forgotten_password_subject')); $this->email->message($message);
if ($this->email->send()) { $this->set_message('forgot_password_successful'); return TRUE; } else { $this->set_error('forgot_password_unsuccessful'); return FALSE; } } } else { $this->set_error('forgot_password_unsuccessful'); return FALSE; } } else { $this->set_error('forgot_password_unsuccessful'); return FALSE; } }
/** * forgotten_password_complete * * @return void * @author Mathew **/ public function forgotten_password_complete($code) { $this->ion_auth_model->trigger_events('pre_password_change');
$identity = $this->config->item('identity', 'ion_auth'); $profile = $this->where('forgotten_password_code', $code)->users()->row(); //pass the code to profile
if (!$profile) { $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); $this->set_error('password_change_unsuccessful'); return FALSE; }
$new_password = $this->ion_auth_model->forgotten_password_complete($code, $profile->salt);
if ($new_password) { $data = array( 'identity' => $profile->{$identity}, 'new_password' => $new_password ); if(!$this->config->item('use_ci_email', 'ion_auth')) { $this->set_message('password_change_successful'); $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_successful')); return $data; } else { $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_forgot_password_complete', 'ion_auth'), $data, true);
$this->email->clear(); $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); $this->email->to($profile->email); $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_new_password_subject')); $this->email->message($message);
if ($this->email->send()) { $this->set_message('password_change_successful'); $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_successful')); return TRUE; } else { $this->set_error('password_change_unsuccessful'); $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); return FALSE; }
} }
$this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); return FALSE; }
/** * forgotten_password_check * * @return void * @author Michael **/ public function forgotten_password_check($code) { $profile = $this->where('forgotten_password_code', $code)->users()->row(); //pass the code to profile
if (!is_object($profile)) { $this->set_error('password_change_unsuccessful'); return FALSE; } else { if ($this->config->item('forgot_password_expiration', 'ion_auth') > 0) { //Make sure it isn't expired $expiration = $this->config->item('forgot_password_expiration', 'ion_auth'); if (time() - $profile->forgotten_password_time > $expiration) { //it has expired $this->clear_forgotten_password_code($code); $this->set_error('password_change_unsuccessful'); return FALSE; } } return $profile; } }
/** * register * * @return void * @author Mathew **/ public function register($username, $password, $email, $additional_data = array(), $group_ids = array()) //need to test email activation { $this->ion_auth_model->trigger_events('pre_account_creation');
$email_activation = $this->config->item('email_activation', 'ion_auth');
if (!$email_activation) { $id = $this->ion_auth_model->register($username, $password, $email, $additional_data, $group_ids); if ($id !== FALSE) { $this->set_message('account_creation_successful'); $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful')); return $id; } else { $this->set_error('account_creation_unsuccessful'); $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful')); return FALSE; } } else { $id = $this->ion_auth_model->register($username, $password, $email, $additional_data, $group_ids);
if (!$id) { $this->set_error('account_creation_unsuccessful'); return FALSE; }
$deactivate = $this->ion_auth_model->deactivate($id);
if (!$deactivate) { $this->set_error('deactivate_unsuccessful'); $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful')); return FALSE; }
$activation_code = $this->ion_auth_model->activation_code; $identity = $this->config->item('identity', 'ion_auth'); $user = $this->ion_auth_model->user($id)->row();
$data = array( 'identity' => $user->{$identity}, 'id' => $user->id, 'email' => $email, 'activation' => $activation_code, ); if(!$this->config->item('use_ci_email', 'ion_auth')) { $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful', 'activation_email_successful')); $this->set_message('activation_email_successful'); return $data; } else { $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_activate', 'ion_auth'), $data, true);
$this->email->clear(); $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); $this->email->to($email); $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_activation_subject')); $this->email->message($message);
if ($this->email->send() == TRUE) { $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful', 'activation_email_successful')); $this->set_message('activation_email_successful'); return $id; } }
$this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful', 'activation_email_unsuccessful')); $this->set_error('activation_email_unsuccessful'); return FALSE; } }
/** * logout * * @return void * @author Mathew **/ public function logout() { $this->ion_auth_model->trigger_events('logout');
$identity = $this->config->item('identity', 'ion_auth'); $this->session->unset_userdata( array($identity => '', 'id' => '', 'user_id' => '') );
//delete the remember me cookies if they exist if (get_cookie($this->config->item('identity_cookie_name', 'ion_auth'))) { delete_cookie($this->config->item('identity_cookie_name', 'ion_auth')); } if (get_cookie($this->config->item('remember_cookie_name', 'ion_auth'))) { delete_cookie($this->config->item('remember_cookie_name', 'ion_auth')); }
//Destroy the session $this->session->sess_destroy();
//Recreate the session if (substr(CI_VERSION, 0, 1) == '2') { $this->session->sess_create(); } else { $this->session->sess_regenerate(TRUE); }
$this->set_message('logout_successful'); return TRUE; }
/** * logged_in * * @return bool * @author Mathew **/ public function logged_in() { $this->ion_auth_model->trigger_events('logged_in');
return (bool) $this->session->userdata('identity'); }
/** * logged_in * * @return integer * @author jrmadsen67 **/ public function get_user_id() { $user_id = $this->session->userdata('user_id'); if (!empty($user_id)) { return $user_id; } return null; }
/** * is_admin * * @return bool * @author Ben Edmunds **/ public function is_admin($id=false) { $this->ion_auth_model->trigger_events('is_admin');
$admin_group = $this->config->item('admin_group', 'ion_auth');
return $this->in_group($admin_group, $id); }
/** * in_group * * @param mixed group(s) to check * @param bool user id * @param bool check if all groups is present, or any of the groups * * @return bool * @author Phil Sturgeon **/ public function in_group($check_group, $id=false, $check_all = false) { $this->ion_auth_model->trigger_events('in_group');
$id || $id = $this->session->userdata('user_id');
if (!is_array($check_group)) { $check_group = array($check_group); }
if (isset($this->_cache_user_in_group[$id])) { $groups_array = $this->_cache_user_in_group[$id]; } else { $users_groups = $this->ion_auth_model->get_users_groups($id)->result(); $groups_array = array(); foreach ($users_groups as $group) { $groups_array[$group->id] = $group->name; } $this->_cache_user_in_group[$id] = $groups_array; } foreach ($check_group as $key => $value) { $groups = (is_string($value)) ? $groups_array : array_keys($groups_array);
/** * if !all (default), in_array * if all, !in_array */ if (in_array($value, $groups) xor $check_all) { /** * if !all (default), true * if all, false */ return !$check_all; } } /** * if !all (default), false * if all, true */ return $check_all; } }
RE: Error codeigniter generates multiple sessions for the same user - xaiborweb - 12-11-2018
@InsiteFX
please help me
RE: Error codeigniter generates multiple sessions for the same user - InsiteFX - 12-11-2018
You need to turn on private messaging in your Forum Profile, otherwise no one
can send you a message.
Did you check your php.ini session settings?
Also in the php.ini make sure that this is not set to 0 (ZERO) session.gc_probability = 1
RE: Error codeigniter generates multiple sessions for the same user - xaiborweb - 12-11-2018
(12-11-2018, 12:51 PM)InsiteFX Wrote: You need to turn on private messaging in your Forum Profile, otherwise no one
can send you a message.
Did you check your php.ini session settings?
Also in the php.ini make sure that this is not set to 0 (ZERO) session.gc_probability = 1 [quote pid='360221' dateline='1544557909']
thanks for answering
/system/libraries/Session/Session.php
PHP Code: <?php /** * CodeIgniter * * An open source application development framework for PHP * * This content is released under the MIT License (MIT) * * Copyright (c) 2014 - 2018, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2018, British Columbia Institute of Technology (https://bcit.ca/) * @license https://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 * @filesource */ defined('BASEPATH') OR exit('No direct script access allowed');
/** * CodeIgniter Session Class * * @package CodeIgniter * @subpackage Libraries * @category Sessions * @author Andrey Andreev * @link https://codeigniter.com/user_guide/libraries/sessions.html */ class CI_Session {
/** * Userdata array * * Just a reference to $_SESSION, for BC purposes. */ public $userdata;
protected $_driver = 'files'; protected $_config; protected $_sid_regexp;
// ------------------------------------------------------------------------
/** * Class constructor * * @param array $params Configuration parameters * @return void */ public function __construct(array $params = array()) { // No sessions under CLI if (is_cli()) { log_message('debug', 'Session: Initialization under CLI aborted.'); return; } elseif ((bool) ini_get('session.auto_start')) { log_message('error', 'Session: session.auto_start is enabled in php.ini. Aborting.'); return; } elseif ( ! empty($params['driver'])) { $this->_driver = $params['driver']; unset($params['driver']); } elseif ($driver = config_item('sess_driver')) { $this->_driver = $driver; } // Note: BC workaround elseif (config_item('sess_use_database')) { log_message('debug', 'Session: "sess_driver" is empty; using BC fallback to "sess_use_database".'); $this->_driver = 'database'; }
$class = $this->_ci_load_classes($this->_driver);
// Configuration ... $this->_configure($params); $this->_config['_sid_regexp'] = $this->_sid_regexp;
$class = new $class($this->_config); if ($class instanceof SessionHandlerInterface) { session_set_save_handler($class, TRUE); } else { log_message('error', "Session: Driver '".$this->_driver."' doesn't implement SessionHandlerInterface. Aborting."); return; }
// Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers if (isset($_COOKIE[$this->_config['cookie_name']]) && ( ! is_string($_COOKIE[$this->_config['cookie_name']]) OR ! preg_match('#\A'.$this->_sid_regexp.'\z#', $_COOKIE[$this->_config['cookie_name']]) ) ) { unset($_COOKIE[$this->_config['cookie_name']]); }
session_start();
// Is session ID auto-regeneration configured? (ignoring ajax requests) if ((empty($_SERVER['HTTP_X_REQUESTED_WITH']) OR strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') && ($regenerate_time = config_item('sess_time_to_update')) > 0 ) { if ( ! isset($_SESSION['__ci_last_regenerate'])) { $_SESSION['__ci_last_regenerate'] = time(); } elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time)) { $this->sess_regenerate((bool) config_item('sess_regenerate_destroy')); } } // Another work-around ... PHP doesn't seem to send the session cookie // unless it is being currently created or regenerated elseif (isset($_COOKIE[$this->_config['cookie_name']]) && $_COOKIE[$this->_config['cookie_name']] === session_id()) { setcookie( $this->_config['cookie_name'], session_id(), (empty($this->_config['cookie_lifetime']) ? 0 : time() + $this->_config['cookie_lifetime']), $this->_config['cookie_path'], $this->_config['cookie_domain'], $this->_config['cookie_secure'], TRUE ); }
$this->_ci_init_vars();
log_message('info', "Session: Class initialized using '".$this->_driver."' driver."); }
// ------------------------------------------------------------------------
/** * CI Load Classes * * An internal method to load all possible dependency and extension * classes. It kind of emulates the CI_Driver library, but is * self-sufficient. * * @param string $driver Driver name * @return string Driver class name */ protected function _ci_load_classes($driver) { $prefix = config_item('subclass_prefix');
if ( ! class_exists('CI_Session_driver', FALSE)) { require_once( file_exists(APPPATH.'libraries/Session/Session_driver.php') ? APPPATH.'libraries/Session/Session_driver.php' : BASEPATH.'libraries/Session/Session_driver.php' );
if (file_exists($file_path = APPPATH.'libraries/Session/'.$prefix.'Session_driver.php')) { require_once($file_path); } }
$class = 'Session_'.$driver.'_driver';
// Allow custom drivers without the CI_ or MY_ prefix if ( ! class_exists($class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$class.'.php')) { require_once($file_path); if (class_exists($class, FALSE)) { return $class; } }
if ( ! class_exists('CI_'.$class, FALSE)) { if (file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$class.'.php') OR file_exists($file_path = BASEPATH.'libraries/Session/drivers/'.$class.'.php')) { require_once($file_path); }
if ( ! class_exists('CI_'.$class, FALSE) && ! class_exists($class, FALSE)) { throw new UnexpectedValueException("Session: Configured driver '".$driver."' was not found. Aborting."); } }
if ( ! class_exists($prefix.$class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) { require_once($file_path); if (class_exists($prefix.$class, FALSE)) { return $prefix.$class; }
log_message('debug', 'Session: '.$prefix.$class.".php found but it doesn't declare class ".$prefix.$class.'.'); }
return 'CI_'.$class; }
// ------------------------------------------------------------------------
/** * Configuration * * Handle input parameters and configuration defaults * * @param array &$params Input parameters * @return void */ protected function _configure(&$params) { $expiration = config_item('sess_expiration');
if (isset($params['cookie_lifetime'])) { $params['cookie_lifetime'] = (int) $params['cookie_lifetime']; } else { $params['cookie_lifetime'] = ( ! isset($expiration) && config_item('sess_expire_on_close')) ? 0 : (int) $expiration; }
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 );
if (empty($expiration)) { $params['expiration'] = (int) ini_get('session.gc_maxlifetime'); } else { $params['expiration'] = (int) $expiration; ini_set('session.gc_maxlifetime', $expiration); }
$params['match_ip'] = (bool) (isset($params['match_ip']) ? $params['match_ip'] : config_item('sess_match_ip'));
isset($params['save_path']) OR $params['save_path'] = config_item('sess_save_path');
$this->_config = $params;
// Security is king 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);
$this->_configure_sid_length(); }
// ------------------------------------------------------------------------
/** * Configure session ID length * * To make life easier, we used to force SHA-1 and 4 bits per * character on everyone. And of course, someone was unhappy. * * Then PHP 7.1 broke backwards-compatibility because ext/session * is such a mess that nobody wants to touch it with a pole stick, * and the one guy who does, nobody has the energy to argue with. * * So we were forced to make changes, and OF COURSE something was * going to break and now we have this pile of shit. -- Narf * * @return void */ protected function _configure_sid_length() { if (PHP_VERSION_ID < 70100) { $hash_function = ini_get('session.hash_function'); if (ctype_digit($hash_function)) { if ($hash_function !== '1') { ini_set('session.hash_function', 1); }
$bits = 160; } elseif ( ! in_array($hash_function, hash_algos(), TRUE)) { ini_set('session.hash_function', 1); $bits = 160; } elseif (($bits = strlen(hash($hash_function, 'dummy', false)) * 4) < 160) { ini_set('session.hash_function', 1); $bits = 160; }
$bits_per_character = (int) ini_get('session.hash_bits_per_character'); $sid_length = (int) ceil($bits / $bits_per_character); } else { $bits_per_character = (int) ini_get('session.sid_bits_per_character'); $sid_length = (int) ini_get('session.sid_length'); if (($bits = $sid_length * $bits_per_character) < 160) { // Add as many more characters as necessary to reach at least 160 bits $sid_length += (int) ceil((160 % $bits) / $bits_per_character); ini_set('session.sid_length', $sid_length); } }
// Yes, 4,5,6 are the only known possible values as of 2016-10-27 switch ($bits_per_character) { case 4: $this->_sid_regexp = '[0-9a-f]'; break; case 5: $this->_sid_regexp = '[0-9a-v]'; break; case 6: $this->_sid_regexp = '[0-9a-zA-Z,-]'; break; }
$this->_sid_regexp .= '{'.$sid_length.'}'; }
// ------------------------------------------------------------------------
/** * Handle temporary variables * * Clears old "flash" data, marks the new one for deletion and handles * "temp" data deletion. * * @return void */ protected function _ci_init_vars() { if ( ! empty($_SESSION['__ci_vars'])) { $current_time = time();
foreach ($_SESSION['__ci_vars'] as $key => &$value) { if ($value === 'new') { $_SESSION['__ci_vars'][$key] = 'old'; } // Hacky, but 'old' will (implicitly) always be less than time() ;) // DO NOT move this above the 'new' check! elseif ($value < $current_time) { unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]); } }
if (empty($_SESSION['__ci_vars'])) { unset($_SESSION['__ci_vars']); } }
$this->userdata =& $_SESSION; }
// ------------------------------------------------------------------------
/** * Mark as flash * * @param mixed $key Session data key(s) * @return bool */ public function mark_as_flash($key) { if (is_array($key)) { for ($i = 0, $c = count($key); $i < $c; $i++) { if ( ! isset($_SESSION[$key[$i]])) { return FALSE; } }
$new = array_fill_keys($key, 'new');
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? array_merge($_SESSION['__ci_vars'], $new) : $new;
return TRUE; }
if ( ! isset($_SESSION[$key])) { return FALSE; }
$_SESSION['__ci_vars'][$key] = 'new'; return TRUE; }
// ------------------------------------------------------------------------
/** * Get flash keys * * @return array */ public function get_flash_keys() { if ( ! isset($_SESSION['__ci_vars'])) { return array(); }
$keys = array(); foreach (array_keys($_SESSION['__ci_vars']) as $key) { is_int($_SESSION['__ci_vars'][$key]) OR $keys[] = $key; }
return $keys; }
// ------------------------------------------------------------------------
/** * Unmark flash * * @param mixed $key Session data key(s) * @return void */ public function unmark_flash($key) { if (empty($_SESSION['__ci_vars'])) { return; }
is_array($key) OR $key = array($key);
foreach ($key as $k) { if (isset($_SESSION['__ci_vars'][$k]) && ! is_int($_SESSION['__ci_vars'][$k])) { unset($_SESSION['__ci_vars'][$k]); } }
if (empty($_SESSION['__ci_vars'])) { unset($_SESSION['__ci_vars']); } }
// ------------------------------------------------------------------------
/** * Mark as temp * * @param mixed $key Session data key(s) * @param int $ttl Time-to-live in seconds * @return bool */ public function mark_as_temp($key, $ttl = 300) { $ttl += time();
if (is_array($key)) { $temp = array();
foreach ($key as $k => $v) { // Do we have a key => ttl pair, or just a key? if (is_int($k)) { $k = $v; $v = $ttl; } else { $v += time(); }
if ( ! isset($_SESSION[$k])) { return FALSE; }
$temp[$k] = $v; }
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? array_merge($_SESSION['__ci_vars'], $temp) : $temp;
return TRUE; }
if ( ! isset($_SESSION[$key])) { return FALSE; }
$_SESSION['__ci_vars'][$key] = $ttl; return TRUE; }
// ------------------------------------------------------------------------
/** * Get temp keys * * @return array */ public function get_temp_keys() { if ( ! isset($_SESSION['__ci_vars'])) { return array(); }
$keys = array(); foreach (array_keys($_SESSION['__ci_vars']) as $key) { is_int($_SESSION['__ci_vars'][$key]) && $keys[] = $key; }
return $keys; }
// ------------------------------------------------------------------------
/** * Unmark temp * * @param mixed $key Session data key(s) * @return void */ public function unmark_temp($key) { if (empty($_SESSION['__ci_vars'])) { return; }
is_array($key) OR $key = array($key);
foreach ($key as $k) { if (isset($_SESSION['__ci_vars'][$k]) && is_int($_SESSION['__ci_vars'][$k])) { unset($_SESSION['__ci_vars'][$k]); } }
if (empty($_SESSION['__ci_vars'])) { unset($_SESSION['__ci_vars']); } }
// ------------------------------------------------------------------------
/** * __get() * * @param string $key 'session_id' or a session data key * @return mixed */ public function __get($key) { // Note: Keep this order the same, just in case somebody wants to // use 'session_id' as a session data key, for whatever reason if (isset($_SESSION[$key])) { return $_SESSION[$key]; } elseif ($key === 'session_id') { return session_id(); }
return NULL; }
// ------------------------------------------------------------------------
/** * __isset() * * @param string $key 'session_id' or a session data key * @return bool */ public function __isset($key) { if ($key === 'session_id') { return (session_status() === PHP_SESSION_ACTIVE); }
return isset($_SESSION[$key]); }
// ------------------------------------------------------------------------
/** * __set() * * @param string $key Session data key * @param mixed $value Session data value * @return void */ public function __set($key, $value) { $_SESSION[$key] = $value; }
// ------------------------------------------------------------------------
/** * Session destroy * * Legacy CI_Session compatibility method * * @return void */ public function sess_destroy() { session_destroy(); }
// ------------------------------------------------------------------------
/** * Session regenerate * * Legacy CI_Session compatibility method * * @param bool $destroy Destroy old session data flag * @return void */ public function sess_regenerate($destroy = FALSE) { $_SESSION['__ci_last_regenerate'] = time(); session_regenerate_id($destroy); }
// ------------------------------------------------------------------------
/** * Get userdata reference * * Legacy CI_Session compatibility method * * @returns array */ public function &get_userdata() { return $_SESSION; }
// ------------------------------------------------------------------------
/** * 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; }
// ------------------------------------------------------------------------
/** * Set userdata * * Legacy CI_Session compatibility method * * @param mixed $data Session data key or an associative array * @param mixed $value Value to store * @return void */ public function set_userdata($data, $value = NULL) { if (is_array($data)) { foreach ($data as $key => &$value) { $_SESSION[$key] = $value; }
return; }
$_SESSION[$data] = $value; }
// ------------------------------------------------------------------------
/** * Unset userdata * * Legacy CI_Session compatibility method * * @param mixed $key Session data key(s) * @return void */ public function unset_userdata($key) { if (is_array($key)) { foreach ($key as $k) { unset($_SESSION[$k]); }
return; }
unset($_SESSION[$key]); }
// ------------------------------------------------------------------------
/** * All userdata (fetch) * * Legacy CI_Session compatibility method * * @return array $_SESSION, excluding flash data items */ public function all_userdata() { return $this->userdata(); }
// ------------------------------------------------------------------------
/** * Has userdata * * Legacy CI_Session compatibility method * * @param string $key Session data key * @return bool */ public function has_userdata($key) { return isset($_SESSION[$key]); }
// ------------------------------------------------------------------------
/** * Flashdata (fetch) * * Legacy CI_Session compatibility method * * @param string $key Session data key * @return mixed Session data value or NULL if not found */ public function flashdata($key = NULL) { if (isset($key)) { return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && ! is_int($_SESSION['__ci_vars'][$key])) ? $_SESSION[$key] : NULL; }
$flashdata = array();
if ( ! empty($_SESSION['__ci_vars'])) { foreach ($_SESSION['__ci_vars'] as $key => &$value) { is_int($value) OR $flashdata[$key] = $_SESSION[$key]; } }
return $flashdata; }
// ------------------------------------------------------------------------
/** * Set flashdata * * Legacy CI_Session compatibility method * * @param mixed $data Session data key or an associative array * @param mixed $value Value to store * @return void */ public function set_flashdata($data, $value = NULL) { $this->set_userdata($data, $value); $this->mark_as_flash(is_array($data) ? array_keys($data) : $data); }
// ------------------------------------------------------------------------
/** * Keep flashdata * * Legacy CI_Session compatibility method * * @param mixed $key Session data key(s) * @return void */ public function keep_flashdata($key) { $this->mark_as_flash($key); }
// ------------------------------------------------------------------------
/** * Temp data (fetch) * * Legacy CI_Session compatibility method * * @param string $key Session data key * @return mixed Session data value or NULL if not found */ public function tempdata($key = NULL) { if (isset($key)) { return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && is_int($_SESSION['__ci_vars'][$key])) ? $_SESSION[$key] : NULL; }
$tempdata = array();
if ( ! empty($_SESSION['__ci_vars'])) { foreach ($_SESSION['__ci_vars'] as $key => &$value) { is_int($value) && $tempdata[$key] = $_SESSION[$key]; } }
return $tempdata; }
// ------------------------------------------------------------------------
/** * Set tempdata * * Legacy CI_Session compatibility method * * @param mixed $data Session data key or an associative array of items * @param mixed $value Value to store * @param int $ttl Time-to-live in seconds * @return void */ public function set_tempdata($data, $value = NULL, $ttl = 300) { $this->set_userdata($data, $value); $this->mark_as_temp(is_array($data) ? array_keys($data) : $data, $ttl); }
// ------------------------------------------------------------------------
/** * Unset tempdata * * Legacy CI_Session compatibility method * * @param mixed $data Session data key(s) * @return void */ public function unset_tempdata($key) { $this->unmark_temp($key); }
} php.ini
session.gc_probability = 1 session.gc_divisor = 100
in my localhost xampp if I create only one session at least for my ip, but in my server I create 1 each time the page is reloaded
[/quote]
RE: Error codeigniter generates multiple sessions for the same user - InsiteFX - 12-12-2018
What version of CodeIgniter are you running?
You should be running the latest version 3.1.9
RE: Error codeigniter generates multiple sessions for the same user - xaiborweb - 12-12-2018
(12-12-2018, 03:47 AM)InsiteFX Wrote: What version of CodeIgniter are you running?
You should be running the latest version 3.1.9
if this version is the one that I'm running
RE: Error codeigniter generates multiple sessions for the same user - InsiteFX - 12-12-2018
That will tell you what version you are running.
RE: Error codeigniter generates multiple sessions for the same user - xaiborweb - 12-12-2018
(12-12-2018, 10:01 AM)InsiteFX Wrote:
That will tell you what version you are running.
3.2.0-dev
the problem is that it creates multiple sessions for the same user, I was wondering if there would be any way to limit a session by ip of the user in case that should change because in the table of ci_session in all sessions I put the ip my vps and this is just the content that you create from the session.
__ci_last_regenerate|i:1544646983;
n my localhost xampp I created a session and if I am active I edited it but if I open another browser or delay in irrigating a page creates a new one and does not delete the previous one.
the server has a canada date but the users are from europe and latin america I was wondering if it could also influence the time schedule also.
the fact is that I am a newbie with codeigniter and in the subject of the sessions it gives many headaches, but I do not know another way of adding a system of registration to the web
I remember the test website in case you can review it: tvglu.net
RE: Error codeigniter generates multiple sessions for the same user - dave friend - 12-12-2018
(12-12-2018, 01:46 PM)xaiborweb Wrote: (12-12-2018, 10:01 AM)InsiteFX Wrote:
That will tell you what version you are running.
3.2.0-dev
That may be part of the problem. You might want to use the current release version which is 3.1.9 available here.
RE: Error codeigniter generates multiple sessions for the same user - xaiborweb - 12-12-2018
(12-12-2018, 01:57 PM)dave friend Wrote: (12-12-2018, 01:46 PM)xaiborweb Wrote: (12-12-2018, 10:01 AM)InsiteFX Wrote:
That will tell you what version you are running.
3.2.0-dev
That may be part of the problem. You might want to use the current release version which is 3.1.9 available here.
hello thank you for answering, it is not the problem because I have this problem for a long time and tested with all versions of codeigniter 3.x this has just become and I have all the same problem.
|