voku/session2db

一个PHP库,充当PHP默认会话处理函数的包装器,将数据存储在MySQL数据库中,提供更好的性能、更高的安全性以及防止会话固定和会话劫持的保护。

4.0.4 2020-03-08 01:06 UTC

README

Build Status Coverage Status Codacy Badge Latest Stable Version Total Downloads License Donate to this project using Paypal Donate to this project using Patreon

👑 Session2DB

PHP默认会话处理程序的即时替代品,将会话数据存储在数据库中,提供更好的性能、更高的安全性以及防止会话固定和会话劫持的保护。

Session2DB实现了会话锁定,确保在多个并发AJAX请求的场合中数据得到正确处理。

它也是适用于扩展到多个Web服务器(使用负载均衡器或循环DNS)的应用程序的解决方案,其中用户的会话数据需要可用。将会话存储在数据库中使它们可供所有服务器使用!

该库支持"flashdata" - 会话变量,它只会在下一个服务器请求中可用,之后会自动删除。通常用于信息或状态消息(例如:“数据已成功更新”)。

Session2DB灵感来源于John Herren的Trick out your session handler文章和Chris Shiflett关于PHP会话的文章,并基于Zebra_Session

代码注释详细,当PHP的错误报告级别设置为E_ALL时,不会生成警告/错误/通知。

要求

PHP 7.x,已激活mysqli扩展,MySQL 5.x+(推荐:mysqlnd扩展)

如何安装

composer require voku/session2db

如何使用

安装后,您需要从该存储库的install目录初始化数据库表,它将包含一个名为session_data.sql的文件。此文件包含用于由类存储会话数据的SQL代码。使用您首选的MySQL管理器(如phpMyAdmin或出色的Adminer)导入或执行SQL代码,并将其导入您选择的数据库。

*注意,此类假定已有一个到MySQL数据库的活跃连接,并且它不会尝试创建一个!

//
// simple (dirty) example
//

<?php
    use voku\db\DB;
    use voku\helper\Session2DB;
    
    DB::getInstance('hostname', 'username', 'password', 'database');
    new Session2DB();
    
    // from now on, use sessions as you would normally
    // this is why it is called a "drop-in replacement" :)
    $_SESSION['foo'] = 'bar';
//
// extended example
//

<?php
    use voku\db\DB;
    use voku\helper\DbWrapper4Session;
    use voku\helper\Session2DB;

    // include autoloader
    require_once 'composer/autoload.php';

    // initialize the database connection e.g. via "voku\db\DB"-class
    $db = DB::getInstance(
        'hostname', // e.g. localhost
        'username', // e.g. user_1
        'password', // e.g. ******
        'database', // e.g. db_1
        'port',     // e.g. 3306
        'charset',  // e.g. utf8mb4
        true,       // e.g. true|false (exit_on_error)
        true,       // e.g. true|false (echo_on_error)
        '',         // e.g. 'framework\Logger' (logger_class_name)
        ''          // e.g. 'DEBUG' (logger_level)
    );
    
    // you can also use you own database implementation via the "Db4Session"-interface,
    // take a look at the "DbWrapper4Session"-class for a example
    $db_wrapper = new DbWrapper4Session($db);
    
    // initialize "Session to DB"
    new Session2DB(
      'add_your_own_security_code_here', // security_code
      0,                                 // session_lifetime
      false,                             // lock_to_user_agent 
      false,                             // lock_to_ip
      1,                                 // gc_probability 
      1000,                              // gc_divisor 
      'session_data',                    // table_name
      60,                                // lock_timeout 
      $db_wrapper,                       // db (must implement the "Db4Session"-interface)
      true                               // start_session (start the session-handling automatically, otherwise you need to use session2db->start() afterwards)
    );

    // from now on, use sessions as you would normally
    // this is why it is called a "drop-in replacement" :)
    $_SESSION['foo'] = 'bar';

    // data is in the database!

支持

请访问 Github | 问题 | PayPal | Patreon 以获取支持和捐款。

请访问 Releases | Twitter | Patreon 以获取状态更新和发布公告。

如需专业支持,请联系 me

感谢

  • 感谢 GitHub(Microsoft)托管代码和良好的基础设施,包括问题管理等。
  • 感谢IntelliJ,因为他们制作了最佳的PHP IDE,并且为我提供了PhpStorm的开源许可证!
  • 感谢Travis CI,它是最出色的、最简单的持续集成工具!
  • 感谢StyleCI,它提供简单但强大的代码风格检查功能。
  • 感谢PHPStanPsalm,它们提供了真正出色的静态分析工具,并帮助发现代码中的错误!