Composer 中國全量鏡像開源了,一塊兒讓 PHP 社區更繁榮

先上連接: https://github.com/zencodex/c...

ZComposer 鏡像誕生於2017年3月份,至今已經運行2年多了,這不是一個多麼有技術含量的東西,因此簡單聊一些開發和解決問題的思路,但願能對你有一點啓發。若是你以爲有些收穫,請點下鼠標,在 github 上給我1個 star(支持下),謝謝。php

  1. 安全性,不對原有的json,zip作修改,不然會引發 hash 變化,從新計算 hash 沒問題(以前第三方有這麼作的),這樣帶來的問題是,沒法對包的安全性作校驗,假若有惡意黑鏡像,對數據作了修改,就沒法判斷了。因此 ZComposer 的鏡像,全部的包都是和 packagist.org 官方一致的,能夠比對 hash ,沒有任何修改。
  2. 穩定性,由於不間斷的採集數據,上傳數據,中間有一個環節出現差錯,就能夠致使有問題,因此務必對採集完的包,經過 hash 值作完整性檢查。有時候第三方的API策略,或者CDN線路均可能致使出現問題。因此作鏡像最大的難點,是穩定性的保障。
  3. Webysther/packagist-mirror(官方推薦的鏡像開源) fork 自 hirak/packagist-crawler,但這些鏡像開源都沒有處理dist包,而dist包纔是最大/最多的,最值得CDN處理的。ZComposer 開源是全量鏡像,包含了對 dist 部分的處理。dist 包還有個 65000上限子目錄數 的問題,1年的時間,包的數量都是成倍的增長。軟鏈接的方案是我原創出來的,或許隨着包的無限增長,還須要設計其餘方案。

ZComposer 鏡像的安裝部署

推薦運行主機配置:linux

  • [x] 內存最好不低於4G
  • [x] 剩餘磁盤空間不低於30G
$ apt install beanstalkd
$ cd composer-mirror
$ composer install

修改配置參數

一般根據本身部署的實際環境,修改參數。詳細配置說明詳見 config.default.php

cp config.default.php config.php,修改 config.php 中的以下參laravel

/**
     * distdir 用於存儲 zip 包
     */
    'distdir' => __DIR__ . '/dist/',

    /**
     * 指向 mirrorUrl 對應的 web 實際目錄
     */
    'cachedir' => __DIR__ . '/cache/',

    /**
     * packagistUrl:官方採集源
     */
    'packagistUrl' => 'https://packagist.org',

    /**
     * 鏡像包發佈站點, packages.json 入口根域名
     */
    'mirrorUrl' => 'https://packagist.laravel-china.org',

    /**
     * .json 中 dist 分發 zip 包的CDN域名
     */
    'distUrl' => 'https://dl.laravel-china.org/',

supervisor 配置

sudo vim /etc/supervisor/supervisord.conf,添加以下配置信息:git

[program:crawler]
command=php ./bin/console app:crawler
directory=/home/zencodex/composer-mirror/  ;部署代碼的位置,自行替換
autostart=true
autorestart=true
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes = 10MB  ; stdout 日誌文件大小,默認 50MB
stdout_logfile_backups = 5      ; stdout 日誌文件備份數
stdout_logfile = /tmp/composer_crawler_stdout.log

[program:composer_daemon]
command=php ./bin/console app:daemon
directory=/home/zencodex/composer-mirror/  ;部署代碼的位置,自行替換
autostart=true
autorestart=true
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes = 10MB  ; stdout 日誌文件大小,默認 50MB
stdout_logfile_backups = 5      ; stdout 日誌文件備份數
stdout_logfile = /tmp/composer_daemon_stdout.log

crontab 定時任務

# sudo crontab -e
# 根據本身環境代碼的位置,替換 /home/zencodex/composer-mirror 
# getcomposer 是獲取最新的 composer,上傳到 CDN 雲存儲

0 */2 * * * /usr/bin/php /home/zencodex/composer-mirror/bin/console app:clear --expired=json
0 1 * * * /usr/bin/php /home/zencodex/composer-mirror/getcomposer.php

經常使用命令

# 執行抓取任務
$ php ./bin/console app:crawler

# 後臺多進程模型同步又拍雲
$ php ./bin/console app:daemon

# 清理過時垃圾文件
$ php ./bin/console app:clear --expired=json

# 掃描並校驗全部json和zip文件的hash256
$ php ./bin/console app:scan

For Developers

  • 沒有使用數據庫存儲,徹底是按目錄結構存儲
  • 每一個包的 dist/zip 文件存儲的是對應 github url的下載地址,因磁盤空間有限,不在本地存儲,直接推送到雲端
  • 清理過時文件,判斷是否有更新,是否過時的依據是文件的時間戳,因此不要手動對文件作 touch,或引發時間戳變化的操做
若是使用非又拍雲的其餘平臺,須要注意如下代碼,須要自行實現
  • ClientHandlerPlugin 須要 Flysystem 的對應 Adapter 有對應接口,本例中只有 zencodex/flysystem-upyun 實現了,其餘第三方包,能夠參照樣例自行實現
  • Cloud::refreshRemoteFile,做用是刷新 CDN 緩存的文件,這個每日有調用頻率限制,因此只刷新 package.json 時使用
  • Cloud::refreshRemoteFile,若是使用非又拍雲的平臺,須要替換爲本身平臺刷新代碼。或者參照 ZenCodex\Support\Flysystem\Adapter\UpyunAdapter 封裝 getClientHandler。
  • Cloud::prefetchDistFile 和 refreshRemoteFile 相似,調用的是雲平臺特殊接口,沒法統一封裝在 Flysystem,因此也經過 getClientHandler 處理

注意最大子目錄數的坑

代碼詳情見 src/Commands/PatchCommand.phpgithub

/*
|--------------------------------------------------------------------------
| linux ext4 支持的最大子目錄數有上限,大約 64000 ~ 65000,目前包的數量已經超過上限
|--------------------------------------------------------------------------
|
| 有三種解決方法,前2種基本不現實。因此本身經過嘗試,找到了3 (軟鏈接不計數的方案)
|
|   1. 更換沒有子文件夾數量限制的文件系統,好比 xfs 
|   2. 或者更改相關代碼,從新編譯 ext4 內核
|   3. 切割大的文件夾,分散不一樣字母開頭的文件。在主文件夾裏面使用軟鏈接,軟鏈接並不計數
|
*/

ZComposer 鏡像早期是  @Summer  提出的構想,期間也獲得了  @overtrue  和LC社區小夥伴們的大力支持,開源也是 Overtrue 提的建議,一併感謝你們們的鼓勵和支持。大俠們會在 2019 年 8 月 3 - 4 日,舉辦國內 第一屆 Laravel Conf China 大會,可謂華山論劍,高手雲集的盛會,趕忙經過官網報名吧:http://laravelconf.cnweb

文章首發於: https://learnku.com/articles/...
相關文章
相關標籤/搜索