Composer
Composer是PHP的依賴管理工具。它允許您聲明您的項(xiàng)目所依賴的庫(kù), 并且它將為您管理 (安裝/更新) 它們。它以每個(gè)項(xiàng)目為基礎(chǔ)管理它們, 并將它們安裝在項(xiàng)目?jī)?nèi)的目錄 (如 vendor) 中. 默認(rèn)情況下, 它不會(huì)在全局范圍內(nèi)安裝任何內(nèi)容。因此, 它是一個(gè)依賴關(guān)系管理器。
1. composer安裝
下載composer.phar文件,即可在任意操作系統(tǒng)上通過PHP運(yùn)行軟件包工具,更新時(shí)可直接重新下載文件;
https://docs.phpcomposer.com/,中文文檔。修改環(huán)境變量后要重啟軟件、重啟CMD才會(huì)重新加載
下載地址
http://composer.p2hp.com/download
2. 修改composer倉(cāng)庫(kù)鏡像地址
2.1 全局配置
# 修改鏡像地址
$ php composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com
# 重置鏡像地址
$ composer config -g --unset repos.packagist
2.2 單個(gè)項(xiàng)目配置
在項(xiàng)目目錄下的composer.json文件內(nèi)加入以下配置信息
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
3. composer命令
comoesr 的require/update都可以更新指定的依賴包(升級(jí)/降級(jí))。
- require更為靈活些,未安裝則進(jìn)行安裝,已安裝則根據(jù)傳入的版本號(hào)進(jìn)行升級(jí)或降級(jí)。
- update則無(wú)法在命令行傳入指定的版本號(hào),需要先手動(dòng)編輯composer.json,指定新的版本號(hào),然后執(zhí)行更新命令。
- install可以用于項(xiàng)目初始化后,初次安裝依賴,且會(huì)優(yōu)先讀取composer.lock中的版本號(hào),以盡可能的保證協(xié)作開發(fā)中包版本的一致性。
composer list:獲取幫助信息;
composer init:以交互方式填寫composer.json文件信息
composer install:從當(dāng)前目錄讀取composer.json文件,處理依賴關(guān)系,并安裝到vendor目錄下;
composer update:獲取依賴的最新版本,升級(jí)composer.lock文件;
composer require:添加新的依賴包到composer.json文件中并執(zhí)行更新;
composer remove twbs/bootstrap; 卸載依賴包
composer search:搜索依賴包;
composer show:列舉所有可用的資源包;
composer validate:檢測(cè)composer.json文件是否有效;
composer self-update:將composer工具更新到最新版本;
composer self-update -r :回滾到安裝的上一個(gè)版本
composer diagnose:執(zhí)行診斷命令
composer clear:清除緩存
create-project:基于composer創(chuàng)建一個(gè)新的項(xiàng)目;
composer dump-autoload:在添加新的類和目錄映射是更新autoloader
composer.lock
中存有的包版本記錄相當(dāng)于執(zhí)行 composer require packageName:versionNo,不存有的相當(dāng)于執(zhí)行composer update packageName with versionRule in composer.json。
當(dāng)我們協(xié)同開發(fā)時(shí),A 在本地安裝了新的依賴包,或者更新了依賴包,會(huì)寫入 composer.lock/composer.json,A 上傳至倉(cāng)庫(kù),B 拉取至本地后,應(yīng)執(zhí)行一次 composer install來同步團(tuán)隊(duì)的版本變更。
提示
注意:每次更新完composer.json后,必須執(zhí)行composer update后才會(huì)生效。
4. aotuload加載優(yōu)化
composer autoload 慢的主要原因在于來自對(duì) PSR-0 和 PSR-4 的支持,加載器得到一個(gè)類名時(shí)需要到文件系統(tǒng)里查找對(duì)應(yīng)的類文件位置,這導(dǎo)致了很大的性能損耗,當(dāng)然這在我們開發(fā)時(shí)還是有用的,這樣我們添加的新的類文件就能即時(shí)生效。 但是在生產(chǎn)模式下,我們想要最快的找到這些類文件,并加載他們。
composer dump-autoload -o (-o 等同于 --optimize)
這個(gè)命令的本質(zhì)是將 PSR-4/PSR-0 的規(guī)則轉(zhuǎn)化為了 classmap 的規(guī)則, 因?yàn)?classmap 中包含了所有類名與類文件路徑的對(duì)應(yīng)關(guān)系,所以加載器不再需要到文件系統(tǒng)中查找文件了??梢詮?classmap 中直接找到類文件的路徑。
這個(gè)命令并沒有考慮到當(dāng)在 classmap 中找不到目標(biāo)類時(shí)的情況,當(dāng)加載器找不到目標(biāo)類時(shí),仍舊會(huì)根據(jù)PSR-4/PSR-0 的規(guī)則去文件系統(tǒng)中查找;
composer dump-autoload -a (-a 等同于 --classmap-authoritative)
執(zhí)行這個(gè)命令隱含的也執(zhí)行了 Level-1 的命令, 即同樣也是生成了 classmap,區(qū)別在于當(dāng)加載器在 classmap 中找不到目標(biāo)類時(shí),不會(huì)再去文件系統(tǒng)中查找(即隱含的認(rèn)為 classmap 中就是所有合法的類,不會(huì)有其他的類了,除非法調(diào)用);如果項(xiàng)目在運(yùn)行時(shí)會(huì)生成類,使用這個(gè)優(yōu)化策略會(huì)找不到這些新生成的類。
composer dump-autoload --apcu
apcu 可以理解為一塊內(nèi)存,并且可以在多進(jìn)程中共享。
這種策略是為了在 Level-1 中 classmap 中找不到目標(biāo)類時(shí),將在文件系統(tǒng)中找到的結(jié)果存儲(chǔ)到共享內(nèi)存中, 當(dāng)下次再查找時(shí)就可以從內(nèi)存中直接返回,不用再去文件系統(tǒng)中再次查找。
在生產(chǎn)環(huán)境下,這個(gè)策略一般也會(huì)與 Level-1 一起使用, 執(zhí)行composer dump-autoload -o --apcu, 這樣,即使生產(chǎn)環(huán)境下生成了新的類,只需要文件系統(tǒng)中查找一次即可被緩存 , 彌補(bǔ)了Level-2/A 的缺陷。
要根據(jù)自己項(xiàng)目的實(shí)際情況來選擇策略,如果你的項(xiàng)目在運(yùn)行時(shí)不會(huì)生成類文件并且需要 composer 的 autoload 去加載,那么使用 Level-2/A 即可,否則使用 Level-1 及 Level-2/B是比較好的選擇。
- Level-2的優(yōu)化基本都是 Level-1 優(yōu)化的補(bǔ)充,Level-2/A 主要是決定在 classmap 中找不到目標(biāo)類時(shí)是否繼續(xù)找下去的問題,Level-2/B
- 主要是在提供了一個(gè)緩存機(jī)制,將在 classmap 中找不到時(shí),將從文件系統(tǒng)中找到的文件路徑緩存起來,加速后續(xù)查找的速度。
- 在執(zhí)行了 Level-2/A 時(shí),表示在 classmap 中找不到不會(huì)繼續(xù)找,此時(shí) Level-2/B 是不會(huì)生效的。
- 不論那種情況都建議要開啟 opcache, 這會(huì)極大的提高類的加載速度,性能提升至少 10倍。
- 提示
- php5.5 以后的版本中默認(rèn)自帶了 opcache ,開啟opcache , 這樣會(huì)極大的加速類的加載。
- 參考資料:
- https://blog.csdn.net/zhouyuqi1/article/details/81098650
5. composer.json詳解
- name,必選屬性,表示包的名稱,由作者名稱和項(xiàng)目名稱組成,使用 / 分割,包名稱可以包含任何字符,包括空格,并且不區(qū)分大小
- description,必選屬性,表示包的簡(jiǎn)短描述,通常這是一行介紹就行。
- version,非必選屬性,表示包的版本,版本的格式必須遵循 X.Y.Z 或 vX.Y.Z,可選后綴 -dev, -patch ( -p ), -alpha ( -a ), -beta ( -b ) 或 -RC, patch, alpha , beta 和 RC 后綴也可以跟一個(gè)數(shù)字。
- type,非必須屬性,表示包的類型,默認(rèn)為庫(kù) library,Composer 原生支持以下4種類型:
library
: 默認(rèn)類型,它只需要將文件復(fù)制到 vendor 目錄。project
: 當(dāng)前包是一個(gè)項(xiàng)目,而不是一個(gè)庫(kù)。例如Yii框架中的composer.json文件的type值就是project;metapackage
: 包含需求并將觸發(fā)其安裝的空包,但不包含文件,并且不會(huì)向系統(tǒng)寫入任何內(nèi)容。因此這種安裝類型并不需要一個(gè) dist 或 source。composer-plugin
: 一個(gè)安裝類型為 composer-plugin 的包,它有一個(gè)自定義安裝類型,可以為其它包提供一個(gè) installler,我們也可以定義一個(gè)自定義類型。 - keywords,非必須屬性,表示一組用于搜索與篩選的與包相關(guān)的關(guān)鍵字
- homepage,非必須屬性,表示項(xiàng)目網(wǎng)站的 URL 地址
- readme,非必須屬性,表示README 文檔的絕對(duì)路徑
- time,非必須屬性,表示包的版本發(fā)布時(shí)間,必須是 YYYY-MM-DD 或者 YYYY-MM-DD HH:MM:SS 格式
- license,表示包的許可證,可以是一個(gè)字符串或者是一個(gè)字符串?dāng)?shù)組
- authors,非必須屬性,表示包的作者,這是一個(gè)對(duì)象數(shù)組。
- support,非必須屬性,表示獲取對(duì)項(xiàng)目支持的信息對(duì)象。
- require,必選屬性,表示必須安裝的依賴包列表,這些包必須滿足條件,否則不會(huì)安裝
- require-dev,非必選屬性,表示開發(fā)或運(yùn)行測(cè)試時(shí)的依賴包列表。
- autoload,表示PHP 自動(dòng)加載的映射,支持 PSR-4 和 PSR-0 自動(dòng)加載,class 映射 和 files 引用。推薦使用 PSR-4 規(guī)范(添加類時(shí),無(wú)需重新生成自動(dòng)加載映射)
- repositories,非必選屬性,表示使用自定義的安裝源,Composer 默認(rèn)只使用 packagist 的安裝源。通過定義 repositories 你可以從任何其他地方獲取包;
- config,非必選屬性,表示一組配置選項(xiàng)。
- scripts,非必選屬性,表示Composer 允許再安裝過程的各個(gè)部分中執(zhí)行腳本。
- extra,非必選屬性,表示scripts 使用的任意擴(kuò)展數(shù)據(jù)
4. composer自動(dòng)加載的過程
- vendor/autoload.php 自動(dòng)加載入口文件
- vendor/composer/autoload_real.php 自動(dòng)加載核心文件
- vendor/composer/ClassLoader.php 自動(dòng)加載類具體實(shí)現(xiàn)文件
- vendor/composer/autoload_static.php 所有的自動(dòng)加載配置
- vendor/composer/autoload_classmap.php classmap自動(dòng)加載配置
- vendor/composer/autoload_namespaces.php PSR0自動(dòng)加載配置
- vendor/composer/autoload_psr4.php PSR4自動(dòng)加載配置
- vendor/composer/autoload_files.php files自動(dòng)加載配置
5.創(chuàng)建自己的composer包
composer init
創(chuàng)建并配置好自己包之后,到https://packagist.org/上傳即可。
prs-4規(guī)范
在PSR-4里邊需要定義一個(gè)命名空間前綴到路徑的映射(相對(duì)于包的根目錄),如果命名空間前綴Foo\指向一個(gè)文件目錄src/,當(dāng)自動(dòng)加載一個(gè)類時(shí),比如Foo\Bar\Baz類,那么這個(gè)類的路徑為 src/Bar/Baz.php,命名空間前綴可以不在路徑之中。在composer.json中的命名空間必須以\結(jié)尾,以避免名字沖突
如果想要明確的指定,在每次請(qǐng)求時(shí)都要載入某些文件,那么你可以使用 files autoloading,通常作為函數(shù)庫(kù)的載入方式(而非類庫(kù))。files引用的所有集合都會(huì)在install/update過程中生成,并存儲(chǔ)到vendor/composer/autoload_files.php文件中。
"autoload": {
"psr-4": {
"Nicen\\LocalImage\\": "src/"
},
"psr-0": {
"Tutsplus\\Library": "src"
},
"files": [
"src/auto.php"
]
},
每次修改composer.json之后,都需要update一次;(composer dump-autoload 命令可創(chuàng)建必要的自動(dòng)加載器文件)
PSR-0 是 PHP-FIG 組推薦的自動(dòng)加載標(biāo)準(zhǔn)。在 PSR-0 標(biāo)準(zhǔn)中,您必須使用命名空間來定義您的庫(kù)。完全限定的類名必須反映\\(\)*結(jié)構(gòu)。此外,您的類必須保存在遵循與命名空間相同的目錄結(jié)構(gòu)的文件中。
在 PSR-0 自動(dòng)加載中,您需要將命名空間映射到目錄。在上面的例子中,我們告訴 Composer 任何以Tutsplus\Library命名空間開頭的東西都應(yīng)該在src\Tutsplus\Library目錄中可用。
贈(zèng)人玫瑰,手有余香