A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							172 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							172 lines
						
					
					
						
							4.1 KiB
						
					
					
				<?php
 | 
						|
/*
 | 
						|
 * Copyright © 2021 ExacTI Technology Solutions. All rights reserved.
 | 
						|
 * GPLv3 General License.
 | 
						|
 * https://exacti.com.br
 | 
						|
 * Phacil PHP Framework - https://github.com/exacti/phacil-framework
 | 
						|
 */
 | 
						|
 | 
						|
namespace Phacil\Framework;
 | 
						|
 | 
						|
use Phacil\Framework\Credis; 
 | 
						|
 | 
						|
/** 
 | 
						|
 * The session manipulation class
 | 
						|
 * 
 | 
						|
 * @since 1.0.0
 | 
						|
 * @package Phacil\Framework 
 | 
						|
 */
 | 
						|
final class Session {
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    public $data = array();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Redis object
 | 
						|
     * @var Credis
 | 
						|
     */
 | 
						|
    public $redis = null;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Name of session
 | 
						|
     * 
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    public $name;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Redis prefix
 | 
						|
     * 
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    private $redisPrefix = "phacil_";
 | 
						|
 | 
						|
    /**
 | 
						|
     * Redis Key
 | 
						|
     * 
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    public $redisKey;
 | 
						|
 | 
						|
    /** @return void  */
 | 
						|
    public function __construct() {
 | 
						|
        $this->name = ((defined('SESSION_PREFIX')) ? SESSION_PREFIX : 'SESS').(isset($_SERVER['REMOTE_ADDR']) ? md5($_SERVER['REMOTE_ADDR']) : md5(date("dmY")));
 | 
						|
 | 
						|
        if (!session_id()) {
 | 
						|
            $this->openSession();
 | 
						|
        }
 | 
						|
 | 
						|
        $this->redis();
 | 
						|
 | 
						|
        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
 | 
						|
     * 
 | 
						|
     * @since 2.0.0
 | 
						|
     * @return false|Credis 
 | 
						|
     */
 | 
						|
    private function redis(){
 | 
						|
        global $engine;
 | 
						|
 | 
						|
        if(!$engine->config->get('session_redis'))
 | 
						|
            return false;
 | 
						|
        
 | 
						|
        $this->redisExpire = ($engine->config->get('session_redis_expire')) ?: session_cache_expire()*60;
 | 
						|
        $this->redisPrefix = ($engine->config->get('session_redis_prefix')) ?: 'phacil_';
 | 
						|
        $this->redisKey = $this->redisPrefix.session_name().session_id();
 | 
						|
 | 
						|
        /**
 | 
						|
         * Instanciate the Credis object
 | 
						|
         * 
 | 
						|
         * @var \Phacil\Framework\Credis
 | 
						|
         */
 | 
						|
        $this->redis = new Credis((($engine->config->get('session_redis_dsn')) ?: '127.0.0.1'), (($engine->config->get('session_redis_port')) ?: '6379'), (($engine->config->get('session_redis_password')) ?: null));
 | 
						|
 | 
						|
        $_SESSION = json_decode($this->redis->get($this->redisKey), true);
 | 
						|
 | 
						|
        return $this->redis;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Close sessions
 | 
						|
     * 
 | 
						|
     * @param bool $force 
 | 
						|
     * @return void 
 | 
						|
     */
 | 
						|
    private function closeSession($force = false) {
 | 
						|
        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;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set the Redis session data
 | 
						|
     * @return void 
 | 
						|
     * @since 2.0.0
 | 
						|
     */
 | 
						|
    public function __destruct()
 | 
						|
    {
 | 
						|
        if($this->redis){
 | 
						|
            $this->redis->set($this->redisKey, json_encode($_SESSION));
 | 
						|
            
 | 
						|
            $this->redis->expire($this->redisKey, ($this->redisExpire));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Flush all session data
 | 
						|
     * @return void 
 | 
						|
     * @since 2.0.0
 | 
						|
     */
 | 
						|
    public function flushAll(){
 | 
						|
        if($this->redis){
 | 
						|
            ($this->redis->flushAll());
 | 
						|
        }
 | 
						|
        $this->closeSession(true);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |