“ThinkPHP”的版本间的差异
来自tomtalk
(→把session写入数据库) |
(→路由) |
||
(未显示同一用户的8个中间版本) | |||
第1行: | 第1行: | ||
=相关链接= | =相关链接= | ||
− | http:// | + | * [http://www.thinkphp.cn/info/tag/name/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/p/1.html ThinkPHP3.1快速入门] |
+ | * [http://doc.thinkphp.cn ThinkPHP文档中心] | ||
+ | * [http://www.tuicool.com/articles/qmA32q2 Laravel兼容原生PHP session] | ||
=安装= | =安装= | ||
获取项目代码,把定文件夹根目录为站点根目录就可以了,不要设置任何东西,就能显示欢迎页。 | 获取项目代码,把定文件夹根目录为站点根目录就可以了,不要设置任何东西,就能显示欢迎页。 | ||
+ | |||
+ | <source lang='text'> | ||
+ | location / { | ||
+ | if (!-e $request_filename) { | ||
+ | rewrite ^(.*)$ /index.php?s=$1 last; | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
=路由= | =路由= | ||
第12行: | 第22行: | ||
试了一下URL_MODEL的几个取值,貌似无效,先使用上面的格式来访问控制器。 | 试了一下URL_MODEL的几个取值,貌似无效,先使用上面的格式来访问控制器。 | ||
+ | |||
+ | 在Application/Common/Conf/config.php中,添加如下配置即可: | ||
+ | |||
+ | <source lang='php'> | ||
+ | return array( | ||
+ | 'URL_ROUTER_ON' => true, | ||
+ | 'URL_ROUTE_RULES' => array( | ||
+ | 'session' => 'Index/session', | ||
+ | 'user/db_test' => 'Index/db_test', | ||
+ | ), | ||
+ | ); | ||
+ | </source> | ||
+ | |||
+ | 注意文件路径,加到其它config.php文件中,无效。 | ||
+ | |||
+ | 后来发现,如果在添加MODULE_ALLOW_LIST,路由定在各模块的config.php文件中,也是可以的。 | ||
+ | |||
+ | <source lang='php'> | ||
+ | 'MODULE_ALLOW_LIST' => array('Home'), | ||
+ | </source> | ||
=把session写入数据库= | =把session写入数据库= | ||
第38行: | 第68行: | ||
=ThinkPHP读取Laravel的Session数据= | =ThinkPHP读取Laravel的Session数据= | ||
+ | |||
+ | ==两个框架对session数据处理的差异== | ||
;ThinkPHP | ;ThinkPHP | ||
+ | <source lang='php'> | ||
+ | //仅系列化,一道手续存储。 | ||
session.serialize_handle=php | session.serialize_handle=php | ||
− | + | //使用ini_set()改变系列化方式不成功,改为修改php.ini文件。 | |
− | + | ||
− | 使用ini_set()改变系列化方式不成功,改为修改php.ini文件。 | + | |
− | + | ||
ini_set("session.serialize_handle", "php_serialize"); | ini_set("session.serialize_handle", "php_serialize"); | ||
+ | </source> | ||
;Laravel | ;Laravel | ||
+ | <source lang='php'> | ||
+ | //先系列化,然后再base64编码存储。 | ||
session.serialize_handle=php_serialize | session.serialize_handle=php_serialize | ||
− | |||
base64_encode($data) | base64_encode($data) | ||
+ | </source> | ||
− | + | ==对ThinkPHP的改造== | |
+ | |||
+ | 为了使ThinkPHP正确读取写Laravel的session数据,把ThinkPHP\Library\Think\Session\Driver\Mysqli.class.php复制一份,命名为LaravelDB.class.php,改一下read()、write()两个方法。 | ||
+ | |||
+ | <source lang='php'> | ||
+ | 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; | ||
+ | } | ||
+ | </source> |
2016年12月22日 (四) 10:15的最后版本
目录
相关链接
安装
获取项目代码,把定文件夹根目录为站点根目录就可以了,不要设置任何东西,就能显示欢迎页。
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; }