第一个链接:https://github.com/zencodex/c...ZComposer镜像诞生于2017年3月,至今已运行超过2年了,这不是一个很技术性的东西,所以简单说一下一些开发和解决问题的思路,希望能给大家一点启发。如果觉得自己有所收获,请在github上点鼠标给我1星(支持),谢谢。安全,不要修改原来的json和zip,否则会导致hash发生变化,重新计算hash是没有问题的(之前第三方已经这样做过),这样带来的问题是包的安全性不能待验证,如果有恶意黑图,修改数据,将无法判断。所以在ZComposer的镜像中,所有的包都是官方和packagist.org一致的,hash可以比对,没有任何修改。稳定性,因为数据的采集和上传是不间断的,如果中间某个环节出现错误,就会出现问题,所以一定要通过hash值检查采集包的完整性。有时第三方API策略或CDN线路可能会导致问题。所以镜像最大的难点就是稳定性的保证。Webysther/packagist-mirror(官方推荐镜像开源)从hirak/packagist-crawlerfork出来,但是这些开源镜像都没有处理dist包,dist包是最大/最多最值得CDN处理的。ZComposer开源的是一个完整的镜像,包括dist部分的处理。dist包也有65,000个子目录的问题。一年内,包裹数量翻了一番。软连接方案是我独创的。或许随着套餐的无限增加,还需要设计其他的方案。ZComposer镜像安装部署推荐运行主机配置:[x]内存最好不低于4G[x]剩余磁盘空间不低于30G$aptinstallbeanstalkd$cdcomposer-mirror$composerinstall修改配置参数通常根据自己的部署在实际环境中修改参数。详细配置说明见config.default.phpcpconfig.default.phpconfig.php,修改config.php中以下参数/***distdir用于存放zip包*/'distdir'=>__DIR__。'/dist/',/***指向mirrorUrl*/'cachedir'=>__DIR__对应的实际web目录。'/cache/',/***packagistUrl:官方合集源*/'packagistUrl'=>'https://packagist.org',/***镜像包发布站点,packages.json入口根域名*/'mirrorUrl'=>'https://packagist.laravel-china.org',/***distdistributionzipin.json包的CDN域名*/'distUrl'=>'https://dl.laravel-china.org/',supervisor配置sudovim/etc/supervisor/supervisord.conf,添加如下配置信息:[program:crawler]command=php./bin/consoleapp:crawlerdirectory=/home/zencodex/composer-mirror/;部署代码的位置,替换autostart=trueautorestart=trueredirect_stderr=true;将stderr重定向到stdout,默认falsestdout_logfile_maxbytes=10MB;stdout日志文件大小,默认50MBstdout_logfile_backups=5;stdout日志文件备份数stdout_logfile=/tmp/composer_crawler_stdout.log[program:composer_daemon]command=php./bin/consoleapp:daemondirectory=/home/zencodex/composer-mirror/;部署代码的位置,替换autostart=trueautorestart=trueredirect_stderr=true;将stderr重定向到stdout,默认falsestdout_logfile_maxbytes=10MB;stdout日志文件大小,默认50MBstdout_logfile_backups=5;stdout日志文件备份号stdout_logfile=/tmp/composer_daemon_stdout.logcrontab定时任务#sudocrontab-e#根据你环境代码的位置替换/home/zencodex/composer-mirror#getcomposer获取最新的composer并上传到CDN云存储0*/2***/usr/bin/php/home/zencodex/composer-mirror/bin/consoleapp:clear--expired=json01***/usr/bin/php/home/zencodex/composer-mirror/getcomposer.php常用命令#执行爬虫任务$php./bin/consoleapp:crawler#后台多进程模型同步和云端抓包$php./bin/consoleapp:daemon#清理过期垃圾文件$php./bin/consoleapp:clear--expired=json#扫描验证所有json和zip文件的hash256$php./bin/consoleapp:scan对于开发者不使用数据库存储,每个包的dist/zip文件是完全按照目录结构存储。存储githuburl对应的下载地址。由于磁盘空间有限,没有存储在本地。直接推送到云端清理过期文件,判断是否有更新。是否过期的依据是文件的时间戳,所以不要手动对文件做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/*|---------------------------------------------------------------------------|linuxext4支持的最大子目录数有上限,大约64000~65000个,目前包数已经超过上限|--------------------------------------------------------------------------||解决方案一共有三种,前两种基本不现实。于是试了一下,找到了3个(软链接不算)||1.更换不限制子文件夹数量的文件系统,如xfs|2.或者更改相关代码,重新编译ext4内核|3.切成大文件夹,散布以不同字母开头的文件。在主文件夹使用软链接,软链接不算|*/ZComposer镜像是早期@Summer提出的想法,期间也得到了@overtrue和LC社区小伙伴的大力支持。开源也是Overtrue的建议。谢谢大家的鼓励和支持。Heroes将于2019年8月3-4日在中国举办首届LaravelConfChina,可谓高手云集华山。赶紧通过官网报名:http://laravelconf.cn文章首发于:https://learnku.com/articles/...
