PHP Composer

Packagist/Composer 中国全量镜像重装上阵

其实,Packagist/Composer 中国全量镜像一个月前就已经脱胎换骨、重装上阵了,经过这一个月来的洗礼(内测 + 开放测试),目前每日数据流量接近 10G,日均 IP 2500+。截至目前,各服务器运行平稳,感谢 又拍云 提供的 CDN 支持,和 UCloud 提供的云服务器。

下面说一说这个镜像的细节吧。

composer install 背后到底是怎么运作的?

我们用一张图来说明一下

Composer 就是我们安装在自己系统上的 composer 工具。所有 package 元数据和 zip 文件的下载、安装工作都是它帮我们完成的。

从图上我们可以看到,不管是 Packagist.org 还是 Github.com 出现故障或者被墙,我们都无法正常安装 package,即便能安装的时候,也是龟速。

说到这里,我们看到如果要做镜像的话,单是为 Packagist.org 做镜像显然是不够的,因为它存放的是所有 package 的元数据,真正安装包还在 Github.com 上面呢。所以“全量镜像”就必须将 Packagist.org 和 Github.com 全部镜像才可以。具体到我们的实现来说,就是将 Packagist.org 上的元数据和 Github.com 上面的 zip 包镜像到国内。

Toran Proxy 时代

去年底我们的中国全量镜像上线时用的是 Toran Proxy 搭建的。这个是一个很不错的搭建镜像的工具,而且也是能够同时镜像 Packagist.com 和 Github.com ,并且还是 Composer 作者亲自开发的,兼容、稳定都不会有问题,所以我们就在第一时间用 Toran Proxy 在国内搭建了一个镜像。但是问题很快就显露了出来,下面挨个说一说:

1、“墙”

国内的开发者之所以抱怨 composer install 慢,就是因为国内到国外(Packagist 主站和 Github 的服务器都在国外)的带宽低,不稳定,而且时不时还被“墙”。由于我们意在帮助国内开发者解决痛点,因此必然要将 Toran Proxy 搭建在国内才能起到加速作用,当然,低带宽和墙都是绕不过去的坑。接下来我们就找解决方案吧,只有两种方案:一是将 Toran Proxy 搭建在国外,比如可以放在香港(香港是中国不可分割的一部分!);二是在国外搭建一个 VPN ,让 Toran Proxy 走 VPN 通道。

对于第一种方案,虽然能够顺畅访问 Packagist 和 Github 了,但是大陆到国外访问速度仍然受限,镜像的意义是为了加速 package 的安装的,速度慢也就失去了这个存在的意义。况且,一但流量大了,单机无法承受负载、带宽也非常昂贵(在香港购买百兆带宽不是好办法!)。

第二种方案倒是可行,但是,Toran Proxy 不支持 CDN 分流的,势必存在单机负载重,吃带宽的问题。

2、版权问题

上面两种方案貌似第二种还能凑合,但是有一个最大的问题 -- “版权”,Toran Proxy 是 Composer 作者开发出来希望企业能够付费购买,然后将收到的钱用于 Composer 和 Packagist 的继续维护上,我们继续使用 Toran Proxy 搭建镜像的话其实是违反了版权协议,再用下去显然不合适。另外,如果想要 Toran Proxy 支持 CDN 加速的话,势必要对其进行改造,这个更不道义了,Toran Proxy 并非真正的开源产品,对其改造更不合适。

那就只能自己开发一个了!!!

从零开始,自己造一个 Proxy

这就是我们的重点了!我们从零开始重写了一个镜像程序,将 Packagist.org 和 Github.com 完美的镜像到国内,并且通过 又拍云 的 CDN 加速,composer install 的速度提升了至少十几倍。

下面咱就用数据说话,有图有真相!

实验:以 4M 宽带(没办法,家里装不了百兆宽带,10M 也不行,哎!)、普通家用电脑、Laravel 5.1.4 来测试 composer install

  1. 解压 laravel 5.1.4 安装包任意目录
  2. 打开 win7 自带的 powershell 并 cd 进入 laravel 目录
  3. 执行如下命令(确保已经安装了 composer !):
C:\laravel> composer clearcache
C:\laravel> Measure-Command {composer install -vvv}

在无缓存的状态下全新安装依赖包总共用时: 52秒;多次统计情况下,平均不超过 60秒。

还有一个哥们给出了更快的速度 -- 10秒(估计是应该是10M或百兆宽带吧,好羡慕):

镜像的实现原理

用图说话:

全量镜像和你同在“中国局域网”内,而且配合 CDN 加速,速度当然杠杠滴!

最后,致谢!

感谢 又拍云 提供的 CDN 支持,和 UCloud 提供的云服务器。