我是一個IT宅男,從高中那會兒便開啓了本身的SNS社交之路。這七八年的光景都用在了SNS社交上,其中有微笑、有汗水、也有心酸。我出門採光,會拍幾張分享到SNS社交;碰見有損社會的行爲,果會斷在SNS社交曝光;內心有點小情緒,會發到SNS社交吧一吐爲快。漸漸的,我習慣了從SNS社交去尋找那些冷不丁的笑點,從文筆大咖的SNS社交中獲取文藝的逼格,從IT大牛的SNS社交裏汲取業界動態和新鮮的知識。而在諸多SNS社交系統中我最先接觸的開源社交SNS仍是基於web2.0版本開發的ThinkSNS。php
經過一些網絡檢索發現,像知乎等相關網站裏關於ThinkSNS的專業技術信息相對較少,許多程序員們想檢索一些關於ThinkSNS技術文檔卻無從得到。所以我便寫了這篇關於ThinkSNS技術方面的文章同諸多喜歡ThinkSNS的創業者們分享,同時也爲開發者提供本身在技術方面的看法。 git
1、咱們常說的TS是什麼?程序員
首先,咱們來熟悉下什麼是TS,TS就是「ThinkSNS」的縮寫,喜好TS程序的人,咱們稱之爲TSer。TS是一款開源程序,代碼託管平臺是GitHub,全部的細節修改,均爲透明性更新。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,均會獲得開發人員的統一回復。web
TS對PHP版本要求壓得比較低,基本行業都跨入了php5.5 or php5.6階段了~可是考慮到國內大部分小衆虛擬主機以及不少對相關專業知識不瞭解的人,因此,TS把php版本壓低到了php5.3.12版本~固然,有人認爲爲何小版本是12,這個版本是php5.3的第一個穩定版~也就是這個小版本以前的版本都不是穩定版,因此不推薦安裝使用。數據庫
2、Laravel框架Eloquent ORM 與TP框架json
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作的數據開發。 安全
3、TS技術優點與拓展
除了引入新的ORM,TS還有不少技術優點,好比:有更容易被理解和集成的基類。這些基類是在第三方庫的基礎上進行二次封裝,使TS的模塊開發中設置的屬性更加標準,也使開發入門更簡單。由於,若是繼承等都是由開發者去集成第三方的類,那麼按照國情,這幾乎是不可能的。而在此基礎上開發者只須要看下基類,就知道集成後本身須要作什麼,無需去學習第三方類。
TS新的拓展(目前是應用)中,原來的靜態資源直接引用應用下的資源,在新的架構中,TS的應用都會被統一移動到一個公開緩存目錄中,方便外部調用。如此設計是爲了使得TS更加安全。這樣用戶就能夠在不暴露代碼的前提下獲得應用中嵌套的靜態資源,站長或者開發人員能夠更安全的把非公開代碼保留在暴露目錄的上層隱藏起來。
那TS具體有哪些功能特點呢?這個問題基本上是仁者見仁智者見智了。由於TS集大成於一身,除了包含社交核心功能外,還有微吧、頻道、資訊,活動、商城等,同時還有許多不一樣行業屬性的TS合做產品,如圖:
4、聊天和風向纔是社交的核心
TS具備獨立開發的原生即時聊天系統。咱們知道,聊天和風向纔是社交的核心。在PC中,TS使用JS輪詢來實現消息的接收等操做;移動端中,TS使用了先進的技術方式—Socket技術,爲了保證用戶記錄的不丟失,避免了P2P點對點傳輸,程序由一個客戶端推送給服務器,服務器在把消息轉推給另外一個客戶端,並在數據庫中概率,達到了多端同時到達的目的。
5、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。因此,你能夠用這個東西拓展出不少意想不到的方法。
6、ThinkSNS不只僅是開源,也是創業加速器
我不知道經過這篇文章的介紹,各位是否真的瞭解了TS,而這只是TS中的百裏挑一,但也是不可忽視的。
TS一直在成長,盡其所能的爲創業者添動力加速度。
總結:TS架構先進,代碼符合PSR規範,用戶使用簡單,兼容性高,創業者能夠很容易的適應TS來知足本身的業務需求,開發者能夠在極短的時間內入手。
時間對於技術人員和創業者來講,是最昂貴的成本,ThinkSNS的祈望和宗旨,是讓創業者,開發者把精力都放在本身該作的事情上。