用技術分析致敬老牌開源社交平台—ThinkSNS

來源:互聯網
上載者:User
我是一個IT宅男,從高中那會兒便開啟了自己的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合作產品,

圖片4.png (77.37 KB, 下載次數: 0)

下載附件

2016-5-20 17:15 上傳

四、聊天和風向才是社交的核心 TS具有獨立開發的原生即時聊天系統。我們知道,聊天和風向才是社交的核心。在PC中,TS使用JS輪詢來實現訊息的接收等操作;移動端中,TS使用了先進的技術方式—Socket技術,為了保證使用者記錄的不丟失,避免了P2P點對點傳輸,程式由一個用戶端推送給伺服器,伺服器在把訊息轉推給另一個用戶端,並在資料庫中幾率,達到了多端同時到達的目的。 五、TS中基礎的技術要點 不上點乾貨的分析都是耍流氓。下面,就講講TS中基礎的技術要點吧。TS中,應用都有一個設定檔,目前應用目錄是apps/ 所以,設定檔就是:“apps//manage.json”,下面有示範代碼:

圖片2.png (7.86 KB, 下載次數: 0)

下載附件

2016-5-20 17:14 上傳

我們可以看到這是比較新的應用配置,老的應用中只需要配置“resource”項即可,配置這項後,靜態資源會緩衝到“storage/app/”下,如果你配置了開發人員模式,每次訪問都會移動到這裡,所以,storage/app目錄是公開的暴露目錄。 實現上述所說就不得不提新的應用安裝類,命名空間是TS\Helper\AppInstall -對新的應用機製做了一些列處理(目前是靜態資源緩衝),應用的運行器也是位於該命名空間下,“TS\Helper\Controller”這個及時運行器,只需要傳入App Name,Controller Name, Action Name,運行器會通過Composer中尋找到應用註冊的命名空間,來運行需要的控制器代碼。 說到這裡,不得不提一點重要的技術加入,就是Composer包管理工具。Composer可以說是所有語言的包管理工具中最好的工具,其提供了第三方包的規範整合,升級,卸載,還有符合PSR-0和PSR-4規範的AutoLoader工具。這使得TS中不在需要冗餘的自訂自動載入來尋找我們需要的類檔案和庫檔案了,使用Composer就可以直接註冊。我們用個最簡單的例子來說明: 據瞭解TSTeam Dev正在開發的全新Web Application應用,其中的重要代碼存在於apps//src目錄下,那麼,TS是如何能找到類自訂的目錄位置的呢?說到這裡,就得知道應用規定的命名空間,應用對命名空間沒有任何要求,唯一有要求的就是控制器,Controller的看命名空間規定為“App\”,這麼規定是方便通過URL參數找到應用的控制器,當然,這個也只是暫時的,以後TS的開發中不在有任何命名空間等技術上的要求,你只需要調用路由器註冊控制器,而不再是TS主動尋找控制器了,使用的所有東西都需要提前註冊,這符合先進的技術要求。 言歸正傳,TS怎麼找到 Controller的呢? 其實TS做的事情很簡單,構造一個“App\\”的類,然後執行個體化這個類即可,而這個類是應用開發的時候通過Composer註冊到了自動載入中的。這個應用准尋的規範是PSR-4,所以,我們可以把代碼放在任何目錄,而不只是src目錄,這個目錄對於TS程式來說是未知的,而Composer卻知道,所以TS只需要“詢問”Composer就可以得到。 此項新技術的引入,不但減少了繁重的開發工作,而且使得TS代碼更加簡單,因為我們不在關心和TS本身代碼無關的事情,我們只需要專註自己代碼部分的開發即可。所以TS的程式碼封裝,除開第三方庫,從去年的24MB減少到了現在的21MB,為什麼還是這麼大?因為TS在使用新的技術的同時,要考慮到舊的模組的運行需求,現在無能為力把舊的模組都重新開發一次,因為沒有這個必要。我們總不能說,生了一個孩子,孩子長醜了就塞回去重新生的吧! TS改變的重點在ORM的加入,那麼新的資料model怎麼使用呢?來個基礎的繼承代碼:

圖片1.png (25.75 KB, 下載次數: 0)

下載附件

2016-5-20 17:14 上傳

沒錯,加上注釋也就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\\Controller\None”的控制器類,繼承這個NoneController對象,那麼,你應用下訪問到了不存在的controller的時候就會重新導向到這個controller。所以,你可以用這個東西拓展出很多意想不到的方法。 六、ThinkSNS不僅僅是開源,也是創業加速器 我不知道通過這篇文章的介紹,各位是否真的瞭解了TS,而這隻是TS中的鳳毛麟角,但也是不可忽視的。 TS一直在成長,盡其所能的為創業者添動力加速度。 總結:TS架構先進,代碼符合PSR規範,使用者使用簡單,相容性高,創業者可以很容易的適應TS來滿足自己的業務需求,開發人員可以在極短的時間內入手。時間對於技術人員和創業者來說,是最昂貴的成本,ThinkSNS的祈望和宗旨,是讓創業者,開發人員把精力都放在自己該做的事情上。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.