Composer 中国全量镜像开源了,一起让 PHP 社区更繁荣,


 

先上链接:https://github.com/zencodex/composer-mirror

ZComposer 镜像诞生于 2017 年 3 月份,至今已不间断稳定运行 2 年多了。如何保证Composer 镜像的稳定性,是面临的最大难题,所以简单聊一些开发和解决问题的思路,希望能对你有一点启发。如果你觉得有些收获,请点下鼠标,在 github 上给我 1 个 star(支持下),谢谢。

ZComposer 镜像的安装部署

推荐运行主机配置:

  • [x] 内存最好不低于 4G
  • [x] 剩余磁盘空间不低于 30G
  •  
    1. $ apt install beanstalkd 
    2. $ cd composer-mirror 
    3. $ composer install 

修改配置参数

通常根据自己部署的实际环境,修改参数。详细配置说明详见 config.default.php

cp config.default.php config.php,修改 config.php 中的如下参

  1. /** 
  2.    * distdir 用于存储 zip 包 
  3.    */ 
  4.   'distdir' => __DIR__ . '/dist/', 
  5.  
  6.   /** 
  7.    * 指向 mirrorUrl 对应的 web 实际目录 
  8.    */ 
  9.   'cachedir' => __DIR__ . '/cache/', 
  10.  
  11.   /** 
  12.    * packagistUrl:官方采集源 
  13.    */ 
  14.   'packagistUrl' => 'https://packagist.org', 
  15.  
  16.   /** 
  17.    * 镜像包发布站点, packages.json 入口根域名 
  18.    */ 
  19.   'mirrorUrl' => 'https://packagist.laravel-china.org', 
  20.  
  21.   /** 
  22.    * .json 中 dist 分发 zip 包的CDN域名 
  23.    */ 
  24.   'distUrl' => 'https://dl.laravel-china.org/', 

supervisor 配置

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

  1. [program:crawler] 
  2. command=php ./bin/console app:crawler 
  3. directory=/home/zencodex/composer-mirror/  ;部署代码的位置,自行替换 
  4. autostart=true 
  5. autorestart=true 
  6. redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false 
  7. stdout_logfile_maxbytes = 10MB  ; stdout 日志文件大小,默认 50MB 
  8. stdout_logfile_backups = 5      ; stdout 日志文件备份数 
  9. stdout_logfile = /tmp/composer_crawler_stdout.log 
  10.  
  11. [program:composer_daemon] 
  12. command=php ./bin/console app:daemon 
  13. directory=/home/zencodex/composer-mirror/  ;部署代码的位置,自行替换 
  14. autostart=true 
  15. autorestart=true 
  16. redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false 
  17. stdout_logfile_maxbytes = 10MB  ; stdout 日志文件大小,默认 50MB 
  18. stdout_logfile_backups = 5      ; stdout 日志文件备份数 
  19. stdout_logfile = /tmp/composer_daemon_stdout.log 

crontab 定时任务

  1. # sudo crontab -e 
  2. # 根据自己环境代码的位置,替换 /home/zencodex/composer-mirror  
  3. # getcomposer 是获取最新的 composer,上传到 CDN 云存储 
  4.  
  5. 0 */2 * * * /usr/bin/php /home/zencodex/composer-mirror/bin/console app:clear --expired=json 
  6. 0 1 * * * /usr/bin/php /home/zencodex/composer-mirror/getcomposer.php 

常用命令

  1. # 执行抓取任务 
  2. $ php ./bin/console app:crawler 
  3.  
  4. # 后台多进程模型同步又拍云 
  5. $ php ./bin/console app:daemon 
  6.  
  7. # 清理过期垃圾文件 
  8. $ php ./bin/console app:clear --expired=json 
  9.  
  10. # 扫描并校验所有json和zip文件的hash256 
  11. $ 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.php

  1. /* 
  2. |-------------------------------------------------------------------------- 
  3. | linux ext4 支持的最大子目录数有上限,大约 64000 ~ 65000,目前包的数量已经超过上限 
  4. |-------------------------------------------------------------------------- 
  5. | 有三种解决方法,前2种基本不现实。所以自己通过尝试,找到了3 (软连接不计数的方案) 
  6. |   1. 更换没有子文件夹数量限制的文件系统,比如 xfs  
  7. |   2. 或者更改相关代码,重新编译 ext4 内核 
  8. |   3. 切割大的文件夹,分散不同字母开头的文件。在主文件夹里面使用软连接,软连接并不计数 
  9. */ 

相关内容