name = (Config::SESSION_PREFIX() ?: 'SESS') . (isset($_SERVER['REMOTE_ADDR']) ? md5($_SERVER['REMOTE_ADDR']) : md5(date("dmY"))); //define('SESSION_PREFIX_INTERNAL_REDIS', Config::REDIS_SESSION_PREFIX() ?: 'phacil_'); $this->redis($redis, $redisDSN, $redisPort, $redisPass, $redis_expire, $redis_prefix); if (!session_id()) { $this->openSession(); } if (session_name() === $this->name) { $this->data =& $_SESSION; } else { $this->openSession(); $this->data =& $_SESSION; } } /** * Open the PHP session * * @return void */ private function openSession() { $this->closeSession(); ini_set('session.use_cookies', 'On'); ini_set('session.use_trans_sid', 'Off'); ini_set('session.cookie_httponly', 1); if ($this->isSecure()) ini_set('session.cookie_secure', 1); session_set_cookie_params(0, '/'); //session_id(md5()); session_name($this->name); session_start(); } /** * Check and iniciate the Redis connection * * @param bool $redis * @param string|null $redisDSN * @param string|null $redisPort * @param string|null $redisPass * @param int|null $redis_expire * @param string $redis_prefix * * @since 2.0.0 * @return false|Credis */ private function redis($redis = false, $redisDSN = null, $redisPort = null, $redisPass = null, $redis_expire = null, $redis_prefix = 'phacil_') { if (!$redis) return false; $redisConfig = new \Phacil\Framework\Session\Redis\Config(); $this->saveHandler = new \Phacil\Framework\Session\Redis\Handler($redisConfig, new \Phacil\Framework\Session\Redis\Logger($redisConfig)); $this->saveHandler->setName($this->name); $a = $this->registerSaveHandler(); return; $this->redisExpire = ($redis_expire) ?: session_cache_expire() * 60; $this->redisPrefix = ($redis_prefix) ?: 'phacil_'; $this->generateRedisKey(); /** * Instanciate the Credis object * * @var \Phacil\Framework\Credis */ $this->redis = new Credis((($redisDSN) ?: '127.0.0.1'), (($redisPort) ?: '6379'), (($redisPass) ?: null)); $_SESSION = unserialize($this->redis->get($this->redisKey)); return $this->redis; } /** * Register save handler * * @return bool */ protected function registerSaveHandler() { return session_set_save_handler( //$this->saveHandler [$this->saveHandler, 'open'], [$this->saveHandler, 'close'], [$this->saveHandler, 'read'], [$this->saveHandler, 'write'], [$this->saveHandler, 'destroy'], [$this->saveHandler, 'gc'] ); } /** * Generate the Redis Session KEY * * @return void */ private function generateRedisKey() { if (session_id()) $this->redisKey = $this->redisPrefix . session_name() . session_id(); return $this->redisKey; } /** * Close sessions * * @param bool $force * @return void */ private function closeSession($force = false) { return ; if (session_status() == PHP_SESSION_ACTIVE || $force) { session_unset(); session_destroy(); } if ($this->redis && $force) { $this->redis->close(); unset($this->redis); } } /** * Check if is secure (SSL) connection * @return bool */ private function isSecure() { return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443; } /** * Flush all session data * @return void * @since 2.0.0 */ public function flushAll() { $this->data = []; if ($this->redis) { ($this->redis->flushAll()); } $this->closeSession(true); } /** * Flush current session data * @return void * @since 2.0.0 */ public function flush() { $this->data = []; if ($this->redis) { ($this->redis->del($this->generateRedisKey())); } $this->closeSession(true); } /** * Return the current session ID * * @since 2.0.0 * @return string|false */ public function getSessionId() { return session_id(); } /** * * @param string $key * @return mixed|null */ public function getData($key) { return isset($this->data[$key]) ? $this->data[$key] : null; } /** * * @param string $key * @param mixed $value * @return $this */ public function setData($key, $value) { $this->data[$key] = $value; return $this; } }