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

作者:刘峰

PHP的终极粉丝,pychina.org 志愿者, 喜欢学习新技术

当前社会的web化平台愈来愈多,多样化越来越严重,然后这根本无法阻止手机市场的发展,在如火如荼的硬件市场上是手机端软件应用在烘托着他们的天空。以上为废话,看过笑笑就行了。
引子
说到手机应用就要面临着一个问题,原生应用的性能好,但是 html5 应用已经占据了很大的份额,在当前的开发中,我们很少使用 socket 来连接服务器,大多数都是 ajax 跨域请求。但是由于 html5 打包的应用,连接存活率十分低效,主要原因在与 html5 打包的 app 各个窗口间的 cookie 等信息不能共享,写入失败等情况导致服务端的很多 web 信息共享方法都失败了。那么我们该怎么办呢?

准备1

让我们来温习下浏览器的存储类型 Web SQL、IndexedDB、Web Storage 以及Application Cache 当然还包括 cookies 然而 cookies 废掉了 所以这里我们就不用它了。扩展阅读 :四种有能力取代 Cookies 的客户端 Web 存储方案
知道了这些存储方式怎么来选择,我就不讲了,这里选用 localstorage(即上面说的web storage)的原因两个:

  1. 能存储 5M 内的数据
  2. 能够长久存储

然后,大家要看 webstorage 存储了解如何使用localstorage

准备2

客户端的存储解决了那么我们就要来看看 PHP 了。由于我主要使用 PHP 所以就以 PHP 为例子了。PHP 的服务端使用的是 session 来纪录会话信息的。
PHP:Sessions 包含了 PHP 所有的session 信息,包括 session 的各个管理方法。你可能需要先简单了解下 session 的安全信息,我们需要用到的有哪些?我们需要人工控制 session 的话怎么做?

  1. 扩展阅读类 The SessionHandler class
  2. 扩展阅读类 The SessionHandlerInterface class
  3. session_set_save_handler 此方法是 ThinkPHP 使用的 session 管理操作绑定方法。 这也是大多数自定义 session的 使用方法。 扩展阅读 :自定义会话管理
  4. ThinkPHP 框架已经写好的 sessiondb 管理方法 mysqli.class.php

首先ThinkPHP框架封装了下session 的管理操作见 functions.php 中的 session 方法(点击只看session 方法):
下面这段代码的核心就

session_set_save_handler(
                array(&$hander,"open"), 
                array(&$hander,"close"), 
                array(&$hander,"read"), 
                array(&$hander,"write"), 
                array(&$hander,"destroy"), 
                array(&$hander,"gc")); 
        }

它定义了用哪个方法来关联session生成/销毁/写入/读出。
我们在 session 函数 可以看到这样一对方法 session_encode 和 session_decode 这两个方法一个是加密 session 会话信息,一个解密 session 会话信息,方便我们直接操作 session 时使用

通讯,web 的默认通讯方式

了解了以上客户端和服务端的核心内容,还需要了解一下通用的 web 访问时 session 管理, 通常 web 访问是在浏览器端写一个 cookie 默认的 cookie 名称叫做 PHPSESSID 然后每次请求都会以 cookie 方式发送到服务端,这样就保证了 session 会话信息的同步。

开发调试

明白了原理那么我们就来做一个 token 好了,这个 token 的值设置为 session 的 id 值即可,然后通过手工处理 session 信息进行覆盖式保证 session 信息的同步。

具体的方法 我在博客中的 ThinkPHP 中如何处理 session 信息 中有了简单的说明。本文其实也是对他的详细说明。核心的代码就是那个session_decode 和session_id($id)

需要说明有以下几点:

  1. 将 session 信息保存在数据库中减少了io读写拥堵
  2. 可以通过 session id 快速定位到数据记录
  3. 可以通过设置 session 过期时间保证数据库中 session 能够得到长效保存
  4. 重定义 sessionid 后其实只是将现有的 session 会话改了个名字,你必须将原有的session 信息回复回去
  5. 客户端需要讲接收到的 token 写入到 localstorage,然后每次发送的时候都作为 body 发送给服务器
  6. 服务端要在入口页面或者基础类的初始化程序中使用 session 处理
  7. 服务端使用了这种方式不需要重新造轮子,不需要再写一套自己的信息管理方式,所有信息通过 session 共享,token 也不用特意另行生成,使用默认的 session_id 即可

总结

说白了,这个问题就是 session 共享。如何进行 session 共享,这里的方法是通过 session的 db 扩展来讲 session 保存在数据库中,但是文件存储也是一样的。可以读取 session 信息可以通过 sessionhandler 扩展 SessionHandler::read ( string $session_id ) 来读取。

道理都是相同的,我也是一个懒人,之所以使用 ThinkPHP 就是因为这一套是完善的一个东西,用起来比较方便,YII 和 CodeIgniter 也是很方便扩展的,别的框架没用过不太清楚。欢迎大家留言回复
至于大家自己写的框架更好扩展了,只需要那个session_set_save_handler这个方法定义下就可以了。so easy!
本文主要是用于引导初学者掌握 PHP 中的 session 管理,面向的知识面比较窄,也比较精确,PHP 的东西还是要打架多死记硬背,然后活学活用。
以 java python go 等其他语言为后端的,其实也是着重在 session 管理上,可以参考,然后找一下本语言内的 session 方法。

转载请注明来源:https://blog.coding.net/blog/thinkphp-app-...

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!