基于 Composer 的 PHP 模塊化開發(fā)

基于 Composer 的 PHP 模塊化開發(fā)

image.png

這個話題之前是在微博公司內(nèi)部做的技術分享怜奖,這里拿出來分享給大家。


image.png

基于 GitHub 或者其它平臺托管的開源項目的引入大家應該都已經(jīng)非常熟悉了抑月,但是公司內(nèi)部項目的模塊化應該怎么做呢?這或許是不少朋友頭疼的問題。

我們先聊聊 PHP 模塊化開發(fā)演進的過程,在沒有 GitHub 之前幢哨,我們大家獲取與分享代碼的方式主要是博客,國內(nèi)的 CSDN 或者博客園還有很多很多嫂便,大家都是從文章內(nèi)復制到自己項目里面使用±塘現(xiàn)在看起來真的是相當原始粗暴,但是那個時代也沒有太多可選的方案顽悼。導致的現(xiàn)象就是一段代碼在 N 個項目里出現(xiàn)曼振,可能見得最多的就是獲取客戶端 IP 的那幾行了几迄,在互聯(lián)網(wǎng)上不止出現(xiàn)了幾萬遍∥盗現(xiàn)在很多項目里都還是這段:

image.png

是不是很熟悉?

這種引入代碼的方式有很多弊端:比如不安全映胁,因為很多人是直接復制粘貼就用上了木羹,根本沒花時間去考證它是否真的是安全的。另外一個問題就是不同步解孙,你今天在別人那里復制過來就用上了坑填,后來作者發(fā)現(xiàn)了 bug 并修復更新了文章也不會通知你,你也不可能記得這段代碼來自哪里去檢查更新弛姜。

image.png

在沒有 Composer 之前我們是如何引入代碼的呢脐瑰?除了上面說的復制粘貼以外,在 PHP 中還有 pear廷臼,不過自從用過兩次我就再也不用它了苍在,一種說不出來的感覺绝页。

不信你可以找一些舊的項目看看,在沒有 Composer 之前的項目中寂恬,你會發(fā)現(xiàn)大量的重復代碼续誉,以及各種花樣的組織格式,各種規(guī)范的寫法初肉。這也是 Composer 誕生的原因之一酷鸦。

image.png

Composer 給我們帶來了諸多的好處:

模塊化,降低代碼重用成本
統(tǒng)一的第三方代碼組織方式
更科學的版本更新
這三個是比較重要的特征了牙咏,基于 GitHub 的共享代碼方式解決了傳統(tǒng)引入方式帶來了各種問題臼隔。

我們先來了解一點 Composer 基礎。

image.png

Composer 的實現(xiàn)結構相對比較簡單妄壶,Packagist.org 是 Composer 官方數(shù)據(jù)源躬翁,它的數(shù)據(jù)基于 GitHub 等代碼托管平臺,你在本地使用 Composer 命令行工具盯拱,基于 Packagist.org 的數(shù)據(jù)信息安裝與更新依賴盒发。 本地安裝 Composer 非常簡單,主要有以下幾種方式:

image.png

新手同學需要注意的是狡逢,這里一定要確定 composer 安裝目錄在環(huán)境變量 $PATH 內(nèi)才能全局使用 composer 命令宁舰。

那接下來我們聊一下如何創(chuàng)建一個 Composer 包。

image.png

步驟很簡單奢浑,創(chuàng)建目錄蛮艰,然后在目錄內(nèi)使用命令 composer init 按照提示完成包的初始化。

接著就是完成你的代碼編寫雀彼,然后在 composer.json 文件配置你的引入方式等信息壤蚜。 然后我們?nèi)绾螌σ呀?jīng)寫好的代碼進行測試呢?

image.png

我們需要在其它任何地方建立一個測試項目(不要在剛才創(chuàng)建的包目錄就可以)徊哑,比如這里我們創(chuàng)建一個叫 'my-package-test' 的目錄袜刷,然后在目錄里 composer init 完成項目初始化。接著就是聲明項目依賴莺丑,我們這里要依賴的就是剛才建立好的包著蟹,由于我們的包還沒有發(fā)布到 packagist,所以是無法直接 composer require 來安裝的梢莽,我們需要告訴 composer 從哪里加載我們的包信息:

$ composer config repositories.foo path /Users/overtrue/www/foo/bar

我們通過這個命令在 composer.json 中 repositories 區(qū)塊添加了一個項目源萧豆。

然后我們添加包依賴:

$ composer require foo/bar:dev-master -vvv

這樣就完成了包的安裝,你會發(fā)現(xiàn)這樣的安裝方式它只是創(chuàng)建了一個軟鏈接到包目錄昏名,所以涮雷,你在測試的時候就可以直接在 vendor/foo/bar 下修改代碼,這樣就加快了你的開發(fā)速度轻局。

這里在原作者的基礎上洪鸭,補充個總結:

在windows或者mac開發(fā)環(huán)境中膜钓,通過composer require……的方式引入本地開發(fā)包,只是創(chuàng)建了一個軟鏈接到包目錄卿嘲。
但是經(jīng)過測試颂斜,在linux服務器環(huán)境中,并不是創(chuàng)建軟鏈接拾枣,而是直接復制一個副本到項目目錄沃疮。
因此,對于在windows或者mac的IDE寫代碼梅肤,并通過IDE自動上傳代碼到linux服務器的同學司蔬,要特別注意這一點,你在IDE中修改的是軟件包的源代碼姨蝴,但是軟鏈接的文件并沒有動過俊啼,所以,不會自動提交到linux服務器中左医。這里提供兩種簡單方式授帕,二選一即可
1、手動把軟連接文件提交到linux服務器中
2浮梢、在linux服務器中使用composer remove foo/bar 跛十,然后再使用composer require foo/bar:dev-master,重新引入軟件包
其實以上兩種方式秕硝,都可以簡單理解成把更新的軟件包代碼復制到了項目中了芥映。

更多細節(jié)這里你就自己去研究了,我們來看看 composer.json 文件:

image.png

我們最需要關心的就是圖里上面的三個部分了远豺,包名奈偏、依賴、以及自動加載躯护,是必不可少的部分惊来。

剛才我們提到了包的安裝,安裝依賴包的方式主要有以下兩種:

image.png

手動方式是不太推薦的榛做,容易寫錯唁盏,比如后面多一個逗號之類的内狸,不過你可以寫完以后使用以下命令來驗證:

$ composer validate

更新依賴就非常簡單了:

image.png

雖然在上一篇文章我們已經(jīng)講了語言化版本检眯,這里再提一次:

image.png
image.png

我們在依賴一個包的時候,很多同學對于依賴的版本一直處于蒙逼狀態(tài)昆淡,那看完下一頁你就恍然大悟了锰瘸,首先是兩個符號:"~" 與 "^"

image.png

接著是版本號的范圍的各種寫法:

image.png

還有包含穩(wěn)定性的標識:

image.png

這里需要說一下生產(chǎn)環(huán)境最重要也一直是好多同學不清楚的一個東西:版本鎖定,很多人在糾結昂灵,要不要把 composer.lock 上傳到代碼庫啊避凝。我可以給你一個特別簡單的判斷方法:

如果你的代碼是一個項目舞萄,就上傳,如果是一個工具包管削,給大家用的倒脓,就別上傳。


image.png

在已經(jīng)存在 composer.lock 的目錄執(zhí)行 composer install 的時候含思,是不會分析包依賴的崎弃,它只是按 composer.lock 中描述的下載地址直接下載,所以會快很多含潘,而且版本號是具體的饲做。那怕包已經(jīng)發(fā)了新版,只要 composer.lock 沒動過遏弱,它就會按 composer.lock 里的版本來安裝盆均。composer update 時會更新 composer.lock,所以不要亂用 composer update漱逸。

包開發(fā)好了怎么發(fā)布泪姨?開源的方式是這樣的:

image.png

最后一句請酌情考慮。

另外一種發(fā)布方式是閉源饰抒,公司內(nèi)部用的包驴娃,上傳到 GitLab 或者其它私有的代碼托管平臺,有兩種玩法:

最容易的玩法循集,在 composer.json 中添加 repositories 直接用 vcs 指定代碼庫地址
這樣做有一個缺點唇敞,當你的包很多的時候,你全都得在 composer.json 中加上才行咒彤。

自已架設 Packagist 類似的服務疆柔,Packagist 官方提供了兩款: Toran,收費镶柱,開源方案是 Satis旷档,不過它偏手動一些,自己酌情選擇即可歇拆。
私有包有一個點需要注意:授權鞋屈,私有包肯定都是需要授權才能訪問的,這里由于方案不太通用故觅,大家根據(jù)自己的場景來解決就好了厂庇。

另外,有一些痛點不曉得啥時候能夠解決:

image.png
image.png
image.png

好在 Laravel China 已經(jīng)為了我提供了國內(nèi)目前最穩(wěn)定最好用的鏡像源输吏,Composer 中文鏡像 / Packagist 中國全量鏡像正式發(fā)布权旷!

最后總結一下:

微信并不適合聊一些代碼細節(jié)的東西,我更多的傾向于提供思路贯溅。

在 PHP 現(xiàn)代開發(fā)中拄氯,Composer 已經(jīng)是離不開的東西了躲查,它的確加快了我們的開發(fā)速度節(jié)省了開發(fā)成本,如果你還在糾結用不用 Composer译柏,那你真得反思一下了镣煮。

本文標題是模塊化開發(fā),內(nèi)容主要介紹了包的創(chuàng)建與測試鄙麦,以及公有包與私有包的發(fā)布方案怎静。但是無法幫你解決,如何拆分項目這類問題黔衡,這得基于你的長期經(jīng)驗積累蚓聘,但是有一些經(jīng)驗可以分享一下:

1、不要過度設計盟劫,很多自以為很 NB 我不把學到的東西用上就是不爽的同學夜牡,上來就分庫分表,uuid 做主鍵之類侣签,項目運營了好幾年一個表還沒到 100 萬條記錄塘装,也是夠厲害的。
2影所、不要過早設計蹦肴,真正 NB 的架構是演進而來的,不是前期設計出來的猴娩,當然不是說完全不需要設計哈阴幌,恰當?shù)母鶕?jù)實際情況來就好,不要立項就把 “千萬”卷中、“億級”矛双、“百億” 這些單位掛在嘴邊,也許到你項目倒閉那天你都沒到過任何一個量級蟆豫。隨著項目逐漸改進即可议忽。
3、優(yōu)先關注成本十减,很多同學以為是性能栈幸,No! 技術團隊真正的成本是人力,所以開發(fā)效率才是優(yōu)先需要關注的帮辟。上次文章在發(fā)在知乎有人就強制把我的 “不要首先關注性能” 解讀成了 “性能不重要”速址,也是夠厲害的,語文也許跟養(yǎng)殖場動物學的织阅。數(shù)學正常一點的人都會算壳繁,一臺服務器多少錢?一個技術員工多少錢荔棉?服務器你花 20 萬是永久資產(chǎn)闹炉,一個員工 20 萬呢?半年工資润樱?一年工資渣触?

————————————————
原文作者:overtrue
轉(zhuǎn)自鏈接:https://learnku.com/articles/5333/modular-development-of-php-based-on-composer
版權聲明:著作權歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權壹若,非商業(yè)轉(zhuǎn)載請保留以上作者信息和原文鏈接嗅钻。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市店展,隨后出現(xiàn)的幾起案子养篓,更是在濱河造成了極大的恐慌,老刑警劉巖赂蕴,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳弄,死亡現(xiàn)場離奇詭異,居然都是意外死亡概说,警方通過查閱死者的電腦和手機碧注,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糖赔,“玉大人萍丐,你說我怎么就攤上這事》诺洌” “怎么了逝变?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奋构。 經(jīng)常有香客問我骨田,道長,這世上最難降的妖魔是什么声怔? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任态贤,我火速辦了婚禮,結果婚禮上醋火,老公的妹妹穿的比我還像新娘悠汽。我一直安慰自己,他們只是感情好芥驳,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布柿冲。 她就那樣靜靜地躺著,像睡著了一般兆旬。 火紅的嫁衣襯著肌膚如雪假抄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音宿饱,去河邊找鬼熏瞄。 笑死,一個胖子當著我的面吹牛谬以,可吹牛的內(nèi)容都是我干的强饮。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼为黎,長吁一口氣:“原來是場噩夢啊……” “哼邮丰!你這毒婦竟也來了?” 一聲冷哼從身側響起铭乾,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤剪廉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炕檩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斗蒋,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年捧书,在試婚紗的時候發(fā)現(xiàn)自己被綠了吹泡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡经瓷,死狀恐怖爆哑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舆吮,我是刑警寧澤揭朝,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站色冀,受9級特大地震影響潭袱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锋恬,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一屯换、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧与学,春花似錦彤悔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卵佛,卻和暖如春杨赤,著一層夾襖步出監(jiān)牢的瞬間敞斋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工疾牲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留植捎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓说敏,卻偏偏與公主長得像鸥跟,于是被迫代替她去往敵國和親丢郊。 傳聞我的和親對象是個殘疾皇子盔沫,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容