ThinkPHP

来自tomtalk
跳转至: 导航搜索

相关链接

安装

获取项目代码,把定文件夹根目录为站点根目录就可以了,不要设置任何东西,就能显示欢迎页。

location / {
    if (!-e $request_filename) {
        rewrite  ^(.*)$  /index.php?s=$1  last;
    }
}

路由

http://thinkphp.example.com/?a=db_test

试了一下URL_MODEL的几个取值,貌似无效,先使用上面的格式来访问控制器。

在Application/Common/Conf/config.php中,添加如下配置即可:

return array(
    'URL_ROUTER_ON'   => true,
    'URL_ROUTE_RULES' => array(
        'session'      => 'Index/session',
        'user/db_test' => 'Index/db_test',
    ),
);

注意文件路径,加到其它config.php文件中,无效。

后来发现,如果在添加MODULE_ALLOW_LIST,路由定在各模块的config.php文件中,也是可以的。

'MODULE_ALLOW_LIST'  => array('Home'),

把session写入数据库

1、改配置文件

'SESSION_OPTIONS' => array(
    'type'   => 'Mysqli',//session采用数据库保存
    'expire' => 1440,//session过期时间,如果不设就是php.ini中设置的默认值
),
'SESSION_TABLE'   => 'wp_session', //必须设置成这样,如果不加前缀就找不到数据表,这个需要注意

仅配置这个就可以了。type最初设置为db,页面报错用不了,用Mysqli就可以了。


2、建数据表

CREATE TABLE `wp_session` (
  `session_id` VARCHAR(255) NOT NULL,
  `session_expire` INT(11) NOT NULL,
  `session_data` BLOB,
  UNIQUE KEY `session_id` (`session_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

ThinkPHP读取Laravel的Session数据

两个框架对session数据处理的差异

ThinkPHP
//仅系列化,一道手续存储。
session.serialize_handle=php
 
//使用ini_set()改变系列化方式不成功,改为修改php.ini文件。
ini_set("session.serialize_handle", "php_serialize");
Laravel
//先系列化,然后再base64编码存储。
session.serialize_handle=php_serialize
base64_encode($data)

对ThinkPHP的改造

为了使ThinkPHP正确读取写Laravel的session数据,把ThinkPHP\Library\Think\Session\Driver\Mysqli.class.php复制一份,命名为LaravelDB.class.php,改一下read()、write()两个方法。

public function read($sessID)
{
    $hander = is_array($this->hander) ? $this->hander[1] : $this->hander;
 
    //fixme 过期时间与Laravel不同,先去掉不用。
    //$res = mysqli_query($hander, "SELECT session_data AS data FROM " . $this->sessionTable . " WHERE id = '$sessID'   AND session_expire >" . time());
    $res = mysqli_query($hander, "SELECT payload AS data FROM " . $this->sessionTable . " WHERE id = '$sessID' ");
    if ($res) {
        $row = mysqli_fetch_assoc($res);
        return base64_decode($row['data']);  //for laravel
    }
    return "";
}
 
public function write($sessID, $sessDataRaw)
{
    $sessData = base64_encode($sessDataRaw);  //for Laravel
    $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
    $expire = time() + $this->lifeTime;
    mysqli_query($hander, "REPLACE INTO  " . $this->sessionTable . " (id, last_activity, payload)  VALUES( '$sessID', '$expire',  '$sessData')");
    if (mysqli_affected_rows($hander))
        return true;
    return false;
}