内容简介:先上链接:https://github.com/zencodex/composer-mirror ZComposer 镜像诞生于 2017 年 3 月份,至今已不间断稳定运行 2 年多了。如何保证Composer 镜像的稳定性,是面临的最大难题,所以简单聊一些开发和解决问...
先上链接:https://github.com/zencodex/composer-mirror
ZComposer 镜像诞生于 2017 年 3 月份,至今已不间断稳定运行 2 年多了。如何保证Composer 镜像的稳定性,是面临的最大难题,所以简单聊一些开发和解决问题的思路,希望能对你有一点启发。如果你觉得有些收获,请点下鼠标,在 github 上给我 1 个 star(支持下),谢谢。
-
安全性,不对原有的 json,zip 做修改,否则会引起 hash 变化,重新计算 hash 没问题(之前第三方有这么做的),这样带来的问题是,无法对包的安全性做校验,假如有恶意黑镜像,对数据做了修改,就无法判断了。所以 ZComposer 的镜像,所有的包都是和 packagist.org 官方一致的,可以比对 hash ,没有任何修改。
-
稳定性,因为不间断的采集数据,上传数据,中间有一个环节出现差错,就可以导致有问题,所以务必对采集完的包,通过 hash 值做完整性检查。有时候第三方的 API 策略,或者 CDN 线路都可能导致出现问题。所以做镜像最大的难点,是稳定性的保障。
- Webysther/packagist-mirror(官方推荐的镜像开源) fork 自 hirak/packagist-crawler,但这些镜像开源都没有处理 dist 包,而 dist 包才是最大 / 最多的,最值得 CDN 处理的。ZComposer 开源是全量镜像,包含了对 dist 部分的处理。dist 包还有个 65000 上限子目录数 的问题,1 年的时间,包的数量都是成倍的增加。软连接的方案是我原创出来的,或许随着包的无限增加,还需要设计其他方案。
ZComposer 镜像的安装部署
推荐运行主机配置:
- [x] 内存最好不低于 4G
- [x] 剩余磁盘空间不低于 30G
$ apt install beanstalkd
$ cd composer-mirror
$ composer install
修改配置参数
通常根据自己部署的实际环境,修改参数。详细配置说明详见 config.default.php
cp config.default.php config.php
,修改 config.php 中的如下参
/**
* 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
,添加如下配置信息:
[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.php
/*
|--------------------------------------------------------------------------
| linux ext4 支持的最大子目录数有上限,大约 64000 ~ 65000,目前包的数量已经超过上限
|--------------------------------------------------------------------------
|
| 有三种解决方法,前2种基本不现实。所以自己通过尝试,找到了3 (软连接不计数的方案)
|
| 1. 更换没有子文件夹数量限制的文件系统,比如 xfs
| 2. 或者更改相关代码,重新编译 ext4 内核
| 3. 切割大的文件夹,分散不同字母开头的文件。在主文件夹里面使用软连接,软连接并不计数
|
*/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Composer 中国全量镜像开源了,一起让 PHP 社区更繁荣
- Kubernetes生态圈繁荣背后的利与弊
- 深度长文:表面繁荣之下,人工智能的发展已陷入困境
- AI繁荣下的隐忧——Google Tensorflow安全风险剖析
- 余凯揭开自动驾驶繁荣外衣:激荡硅谷、失落中国 | 自动驾驶这十年
- 对话AWS上海AI研究院长张峥:寻找繁荣背后的正确道路
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Parsing Techniques
Dick Grune、Ceriel J.H. Jacobs / Springer / 2010-2-12 / USD 109.00
This second edition of Grune and Jacobs' brilliant work presents new developments and discoveries that have been made in the field. Parsing, also referred to as syntax analysis, has been and continues......一起来看看 《Parsing Techniques》 这本书的介绍吧!