PHP(ThinkPHP)与手机app之间共享信息的解决思路

2015-08-07 10:42:00
hainuo
原创 3185
摘要:PHP程序如何通过共享session信息来处理与手机端app信息共享的问题
本文同步发表在[coding博客](https://blog.coding.net)上>当前社会的web化平台愈来愈多,多样化越来越严重,然后这根本无法阻止手机市场的发展,在如火如荼的硬件市场上是手机端软件应用在烘托着他们的天空。以上为废话,看过笑笑就行了。 # 引子说到手机应用就要面临着一个问题,原生应用的性能好,但是html5应用已经占据了很大的份额,在当前的开发中,我们很少使用socket来连接服务器,大多数都是ajax跨域请求。但是由于html5打包的应用,连接存活率十分低效,主要原因在与html5打包的app各个窗口间的cookie 等信息不能共享,写入失败等情况导致服务端的很多web信息共享方法都失败了。那么我们该怎么办呢? # 准备1 让我们来温习下浏览器的存储类型Web SQL、IndexedDB、Web Storage以及Application Cache 当然还包括cookies 然而 cookies废掉了 所以这里我们就不用它了。扩展阅读 :[四种有能力取代Cookies的客户端Web存储方案](http://developer.51cto.com/art/201310/413506_all.htm)知道了这些存储方式怎么来选择,我就不讲了,这里选用localstorage(即上面说的web storage)的原因两个:1. 能存储5m内的数据1. 能够长久存储 然后,大家要看 [webstorage存储](http://www.w3school.com.cn/html5/html_5_webstorage.asp)了解如何使用localstorage# 准备2客户端的存储解决了那么我们就要来看看 PHP了。由于我主要使用PHP所以就以PHP为例子了。PHP的服务端使用的是session来纪录会话信息的。[PHP:Sessions](http:// php.net/manual/zh/book.session.php)包含了PHP所有的session信息包括session 的各个管理方法。你可能需要先简单了解下[session的安全信息](http://php.net/manual/zh/session.security.php),我们需要用到的有哪些?我们需要人工控制session的话怎么做?1. 扩展阅读 类 [The SessionHandler class](http://php.net/manual/zh/class.sessionhandler.php) 1. 扩展阅读 类[The SessionHandlerInterface class](http://php.net/manual/zh/class.sessionhandlerinterface.php) 1. [session_set_save_handler](http://php.net/manual/zh/function.session-set-save-handler.php) 此方法是ThinkPHP使用的session管理操作绑定方法。 这也是大多数自定义session的使用方法。 扩展阅读 :[自定义会话管理](http://php.net/manual/zh/session.customhandler.php) 1. ThinkPHP框架已经写好的[sessiondb管理方法mysqli.class.php](https://github.com/liu21st/thinkphp/blob/master/ThinkPHP/Library/Think/Session/Driver/Mysqli.class.php) 首先ThinkPHP框架封装了下session 的管理操作见[functions.php](https://github.com/liu21st/thinkphp/blob/master/ThinkPHP/Common/functions.php) 中的[session方法(点击只看session方法)](http://blog.hainuo.info/blog/83.html):下面这段代码的核心就```session_set_save_handler( array(&$hander,"open"), array(&$hander,"close"), array(&$hander,"read"), array(&$hander,"write"), array(&$hander,"destroy"), array(&$hander,"gc")); }````它定义了用哪个方法来关联session生成/销毁/写入/读出。我们在[session函数](http://php.net/manual/zh/ref.session.php) 可以看到这样一对方法 [session_encode](http://php.net/manual/zh/function.session-encode.php) 和[session_decode](http://php.net/manual/zh/function.session-decode.php) 这两个方法一个是加密session会话信息,一个解密session会话信息,方便我们直接操作session时使用# 通讯,web的默认通讯方式了解了以上客户端和服务端的核心内容,还需要了解一下通用的web访问时session管理, 通常web访问是在浏览器端写一个cookie 默认的cookie名称叫做PHPSESSID 然后每次请求都会以cookie方式发送到服务端,这样就保证了session会话信息的同步。# 开发调试明白了原理那么我们就来做一个token好了,这个token的值设置为session的id值即可,然后通过手工处理session信息进行覆盖式保证session信息的同步。>具体的方法 我在博客中的[ThinkPHP中如何处理session信息](http://blog.hainuo.info/blog/61.html) 中有了简单的说明。本文其实也是对他的详细说明。核心的代码就是那个`session_decode` 和`session_id($id)`需要说明有以下几点:1. 将session信息保存在数据库中减少了io读写拥堵1. 可以通过session id 快速定位到数据记录1. 可以通过设置session过期时间保证数据库中session能够得到长效保存1. 重定义sessionid后其实只是将现有的session会话改了个名字,你必须将原有的session信息回复回去1. 客户端需要讲接收到的token写入到localstorage,然后每次发送的时候都作为body发送给服务器1. 服务端要在入口页面或者基础类的初始化程序中使用session处理1. 服务端使用了这种方式不需要重新造轮子,不需要再写一套自己的信息管理方式,所有信息通过session共享,token也不用特意另行生成,使用默认的session_id即可# 总结 说白了,这个问题就是session共享。如何进行session共享,这里的方法是通过session的db扩展来讲session保存在数据库中,但是文件存储也是一样的。可以读取session信息可以通过sessionhandler扩展[SessionHandler::read ( string $session_id )](http://php.net/manual/zh/sessionhandler.read.php)来读取。>道理都是相同的,我也是一个懒人,之所以使用ThinkPHP就是因为这一套是完善的一个东西,用起来比较方便,YII和CodeIgniter也是很方便扩展的,别的框架没用过不太清楚。欢迎大家留言回复>至于大家自己写的框架更好扩展了,只需要那个`session_set_save_handler`这个方法定义下就可以了。so easy!>本文主要是用于引导初学者掌握PHP中的session管理,面向的知识面比较窄,也比较精确,PHP的东西还是要打架多死记硬背,然后活学活用。>以java python go等其他语言为后端的,其实也是着重在session管理上,可以参考,然后找一下本语言内的session方法。
发表评论
捌 加 柒 =
评论通过审核后显示。