下载地址:https://downloads.joomla.org/it/cms/joomla3/3-4-6

本文测试环境为 PHP 5.5.9+apache+Ubuntu14.04.5 LTS+Joomla3.4.6

index.php 第42行下好断点,程序流程如下,这里我们重点关注 loadSession 方法。

loadSession 方法中会去实例化 JSessionStorageDatabase 类(下图第737行),而该类继承自 JSessionStorage 类,在实例化时会调用父类的 __construct 方法。在父类 __construct 方法中,我们看到使用了 session_set_save_handler 函数来处理 session ,函数中的 $this 指的就是 JSessionStorageDatabase 类对象(下图第88行)。接着,程序开启了 session_start 函数。

在经过 session_set_save_handler 函数处理后,如果调用 session_start 函数,就会依次调用 open、read、write、close 等方法,可以通过如下代码验证该结论。

<?php

class SessionDemo
{
    public function open()
    {
        echo 'open'.'<br>';
    }

    public function close()
    {
        echo 'close'.'<br>';
    }

    public function read()
    {
        echo 'read'.'<br>';
    }

    public function write()
    {
        echo 'write'.'<br>';
    }

    public function destroy()
    {
        echo 'destroy'.'<br>';
    }

    public function gc()
    {
        echo 'gc'.'<br>';
    }
}

$session = new SessionDemo();

session_set_save_handler(
    array($session, 'open'), array($session, 'close'), array($session, 'read'), array($session, 'write'),
    array($session, 'destroy'), array($session, 'gc')
);
点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖