干货:用技术分析致敬老牌开源社交平台—ThinkSNS
2016-08-12 (173714)时间对于技术人员和创业者来说,是最昂贵的成本,ThinkSNS的祈望和宗旨,是让创业者,开发者把精力都放在自己该做的事情上。
干货:用技术分析致敬老牌开源社交平台—ThinkSNS
我从高中那会儿便开启了自己的SNS社交之路。这七八年的光景都用在了SNS社交上,其中有微笑、有汗水、也有心酸。我出门采光,会拍几张分享到SNS社交;遇见有损社会的行为,果会断在SNS社交曝光;心里有点小情绪,会发到SNS社交吧一吐为快。渐渐的,我习惯了从SNS社交去寻找那些冷不丁的笑点,从文笔大咖的SNS社交中获取文艺的逼格,从IT大牛的SNS社交里汲取业界动态和新鲜的知识。而在诸多SNS社交系统中我最早接触的开源社交SNS还是基于web2.0版本开发的ThinkSNS。
通过一些网络检索发现,像知乎等相关网站里关于ThinkSNS的专业技术信息相对较少,许多程序员们想检索一些关于ThinkSNS技术文档却无从获得。因此我便写了这篇关于ThinkSNS技术方面的文章同诸多喜欢ThinkSNS的创业者们分享,同时也为开发者提供自己在技术方面的见解。
一、我们常说的TS是什么?
首先,我们来熟悉下什么是TS,TS就是“ThinkSNS”的缩写,喜爱TS程序的人,我们称之为TSer。TS是一款开源程序,代码托管平台是GitHub,所有的细节修改,均为透明性更新。
使用者可以通过官网(http://www.thinksns.com)和官方演示社区(Demo站 http://demo.thinksns.com)以及GitHub仓库(https://github.com/medz/ThinkSNS-4)获得TS最新的开发动态~当然,如果你有兴趣也可以Pull requesTS(简称PR)代码给TS开发人员,开发人员得到代码之后如果符合开源需求,就会合并到TS版本的当中,如果普通用户遇到问题,可以在demo站或者Github中提交Issues,均会得到开发人员的统一回复。
TS对PHP版本要求压得比较低,基本行业都跨入了php5.5 or php5.6阶段了~但是考虑到国内大部分小众虚拟主机以及很多对相关专业知识不了解的人,所以,TS把php版本压低到了php5.3.12版本~当然,有人认为为什么小版本是12,这个版本是php5.3的第一个稳定版~也就是这个小版本之前的版本都不是稳定版,所以不推荐安装使用。
二、Laravel框架Eloquent ORM 与TP框架
TS在2016年的开发过程中做了比较大的底层架构变动。众所周知,TS的底层是基于ThinkPHP框架进行二次修改的,用户不能就ThinkPHP直接对TS进行升级其中一个主要原因就是TP框架并非完全遵循的MIT开源协议。当然,对开发者来说TP框架技术架构本身也存在不够先进和过于抽象的问题。所以综合考虑,TS在数据交换时使用了Laravel框架的Eloquent ORM 。
Eloquent ORM 的优势是什么?这款ORM对数据的处理比较类似于Node.js的数据处理即一切皆为对象,而且ORM对数据关系的处理效率是不输于doctrine的,这也是TS这么选择的原因。当然,考虑更多的是为以后更先进的架构做准备。TS将慢慢采用拓展方式进行开发,并对整个TS程序做架构数据交换等。
新的ORM的引入让TS考虑php7平台的运行,但php7已经完全删除了MySQL的 连接方式,只有PDO和MySQLi。那么,如果想要在php7环境下运行,必定对DB类做重新修改,但是考虑到兼容性的问题,所以目前依旧在旧的应用上,还是由model生成SQL,然后把SQL交给PDO来执行。而新开发的应用和功能均使用全新的ORM做的数据开发。
三、TS技术优势与拓展
除了引入新的ORM,TS还有很多技术优势,比如:有更容易被理解和集成的基类。这些基类是在第三方库的基础上进行二次封装,使TS的模块开发中设置的属性更加标准,也使开发入门更简单。因为,如果继承等都是由开发者去集成第三方的类,那么按照国情,这几乎是不可能的。而在此基础上开发者只需要看下基类,就知道集成后自己需要做什么,无需去学习第三方类。
TS新的拓展(目前是应用)中,原来的静态资源直接引用应用下的资源,在新的架构中,TS的应用都会被统一移动到一个公开缓存目录中,方便外部调用。如此设计是为了使得TS更加安全。这样用户就可以在不暴露代码的前提下得到应用中嵌套的静态资源,站长或者开发人员可以更安全的把非公开代码保留在暴露目录的上层隐藏起来。
那TS具体有哪些功能特色呢?这个问题基本上是仁者见仁智者见智了。因为TS集大成于一身,除了包含社交核心功能外,还有微吧、频道、资讯,活动、商城等,同时还有许多不同行业属性的TS合作产品,如图:
四、聊天和风向才是社交的核心
TS具有独立开发的原生即时聊天系统。我们知道,聊天和风向才是社交的核心。在PC中,TS使用JS轮询来实现消息的接收等操作;移动端中,TS使用了先进的技术方式—Socket技术,为了保证用户记录的不丢失,避免了P2P点对点传输,程序由一个客户端推送给服务器,服务器在把消息转推给另一个客户端,并在数据库中几率,达到了多端同时到达的目的。
五、TS中基础的技术要点
不上点干货的分析都是耍流氓。下面,就讲讲TS中基础的技术要点吧。TS中,应用都有一个配置文件,目前应用目录是apps/<app name> 所以,配置文件就是:“apps/<app name>/manage.json”,下面有演示代码:
我们可以看到这是比较新的应用配置,老的应用中只需要配置“resource”项即可,配置这项后,静态资源会缓存到“storage/app/<app name>”下,如果你配置了开发者模式,每次访问都会移动到这里,所以,storage/app目录是公开的暴露目录。
实现上述所说就不得不提新的应用安装类,命名空间是TS\Helper\AppInstall -对新的应用机制做了一些列处理(目前是静态资源缓存),应用的运行器也是位于该命名空间下,“TS\Helper\Controller”这个及时运行器,只需要传入App Name,Controller Name, Action Name,运行器会通过Composer中查找到应用注册的命名空间,来运行需要的控制器代码。
说到这里,不得不提一点重要的技术加入,就是Composer包管理工具。Composer可以说是所有语言的包管理工具中最好的工具,其提供了第三方包的规范集成,升级,卸载,还有符合PSR-0和PSR-4规范的AutoLoader工具。这使得TS中不在需要冗余的自定义自动加载来查找我们需要的类文件和库文件了,使用Composer就可以直接注册。我们用个最简单的例子来说明:
据了解TS开发团队正在开发的全新Web Application应用,其中的重要代码存在于apps/<app na,e>/src目录下,那么,TS是如何能找到类自定义的目录位置的呢?说到这里,就得知道应用规定的命名空间,应用对命名空间没有任何要求,唯一有要求的就是控制器,Controller的看命名空间规定为“App\<app Name>”,这么规定是方便通过URL参数找到应用的控制器,当然,这个也只是暂时的,以后TS的开发中不在有任何命名空间等技术上的要求,你只需要调用路由器注册控制器,而不再是TS主动查找控制器了,使用的所有东西都需要提前注册,这符合先进的技术要求。
言归正传,TS怎么找到 Controller的呢?
其实TS做的事情很简单,构造一个“App\<app name>\<controller name>”的类,然后实例化这个类即可,而这个类是应用开发的时候通过Composer注册到了自动加载中的。这个应用准寻的规范是PSR-4,所以,我们可以把代码放在任何目录,而不只是src目录,这个目录对于TS程序来说是未知的,而Composer却知道,所以TS只需要“询问”Composer就可以得到。
此项新技术的引入,不但减少了繁重的开发工作,而且使得TS代码更加简单,因为我们不在关心和TS本身代码无关的事情,我们只需要专注自己代码部分的开发即可。所以TS的代码包,除开第三方库,从去年的24MB减少到了现在的21MB,为什么还是这么大?因为TS在使用新的技术的同时,要考虑到旧的模块的运行需求,现在无能为力把旧的模块都重新开发一次,因为没有这个必要。我们总不能说,生了一个孩子,孩子长丑了就塞回去重新生的吧!
TS改变的重点在ORM的加入,那么新的数据model怎么使用呢?来个基础的继承代码:
没错,加上注释也就20行,那和之前的模型继承有什么区别?一个区别在于传递参数的改变,ORM支持在MySQL,SqlLite,SQL server等数据库中自由切换。另一个区别在于定义的关键词的改变,一但定义了模型,就可以对表经常操作了,是不是很简单。上表中,查询一条feed_id是1的数据,很简单,Feed::find(1)。OK,我们已经查询完成了。当然,返回的是一个object,而不是纯数据的Array。
如果你想把它变成你要的数组,比如$feed就是上面的查询返回的数据,那么只需要 $feed->toArray()就可以做到。如果我们能知道表的字段,我们就可以直接把查询出来的数据当成对象成员的形式读取,比如$feed->feed_id或者$feed->cTime,也可以直接把这个对象传递给foreach来对属性进行遍历,由此看出,新的ORM对数据处理我们无需像以前那样对数组操作,但是我们可以对遍历等在以前的基础上不变。
当然,具体的更多用处,可以查询Laravel框架官方文档,再举一个ORM中关系的例子。
public function phone()
{
return $this->hasOne('Phone');
}
在上面的方法中定义一个这样的方法,我们一对一的关联了Phone这个模型,$data = Feed::find(1)->phone 我们就可以得到phone主键feed_id和feed表相同的值的表对象。是不是很方便?
最后再来说一点controller上面的事情把,在TS中封装了一个叫做“TS\Base\NoneController”的基类,在你的控制器下,定义一个叫做“App\<app name>\Controller\None”的控制器类,继承这个NoneController对象,那么,你应用下访问到了不存在的controller的时候就会重定向到这个controller。所以,你可以用这个东西拓展出很多意想不到的方法。
六、ThinkSNS不仅仅是开源,也是创业加速器
我不知道通过这篇文章的介绍,各位是否真的了解了TS,而这只是TS中的凤毛麟角,但也是不可忽视的。
TS一直在成长,尽其所能的为创业者添动力加速度。
总结:TS架构先进,代码符合PSR规范,用户使用简单,兼容性高,创业者可以很容易的适应TS来满足自己的业务需求,开发者可以在极短的时间内入手。
时间对于技术人员和创业者来说,是最昂贵的成本,ThinkSNS的祈望和宗旨,是让创业者,开发者把精力都放在自己该做的事情上。