相关文章

上一篇文章 提到的哈希值, 将会在这篇文章揭晓, 看完这篇文章, 也将会清楚地了解 Composer 镜像的工作原理.

认识 Composer 镜像的工作原理之前, 先来认识一个非常好用的参数 -vvv:

composer require monolog/monolog -vvv

随便找个目录, 执行上面的命令, 会看到这些东西:

Downloading https://packagist.phpcomposer.com/packages.json

Writing C:/Users/Administrator/AppData/Local/Composer/repo/https---packagist.phpcomposer.com/packages.json into cache

Downloading https://packagist.phpcomposer.com/p/provider-2013%2427453ee820a0c569990f0e5c705651d4902266bfb0d66ac4a8675350cc8c3dee.json

Writing C:/Users/Administrator/AppData/Local/Composer/repo/https---packagist.phpcomposer.com/p-provider-2013.json into cache

OK, 这个链接 https://packagist.phpcomposer.com/packages.json 是我们关注的重点, 看看里面有什么:

{
"packages":[ ],
"notify":"https://packagist.org/downloads/%package%",
"notify-batch":"https://packagist.org/downloads/",
"providers-url":"/p/%package%$%hash%.json",
"search":"https://packagist.org/search.json?q=%query%&type=%type%",
"provider-includes":{
"p/provider-2013$%hash%.json":{
"sha256":"27453ee820a0c569990f0e5c705651d4902266bfb0d66ac4a8675350cc8c3dee"
},
"p/provider-2014$%hash%.json":{
"sha256":"54926c64d3af83e29338c05bf2e0b4273786b644493976b91ac521e48fcb0898"
},
"p/provider-2015$%hash%.json":{
"sha256":"3bd588c60bfd7845a93af3f834dd2f45b975cd70a8cb8d4ea3b1dd40c9859454"
},
"p/provider-2016$%hash%.json":{
"sha256":"430744185fc781f75b4e9c966b3954f374c24f200d8124a5a43b15bce115aded"
},
"p/provider-2017-01$%hash%.json":{
"sha256":"443ade7677cb86f103d95725a043725bfeb6f80c65a7f28b7295afd2874642c6"
},
"p/provider-2017-04$%hash%.json":{
"sha256":"9343747a3c94f2c54b8a0ac2b7df5fd01f6b38e377c21a10ea4af19dd7739088"
},
"p/provider-2017-07$%hash%.json":{
"sha256":"5c17b5bf4ace4c44112b4e3db1dbc7efd891bd023e329afdb346753fd388596c"
},
"p/provider-2017-10$%hash%.json":{
"sha256":"b04c29739124e5da0f39c48683f7ddcf2cc04483e6022967d0f5f3b8dc662ae2"
},
"p/provider-archived$%hash%.json":{
"sha256":"97ce4ddebac5598dcb1c82c70de4254889755951bf988c34415fddfa09ad83b4"
},
"p/provider-latest$%hash%.json":{
"sha256":"54d70158a7603fb1d47e64d1a11a4518244a4752039ae6d8dd1e9e3c07bf5665"
}
},
"sync-time":"2017-12-02T03:37:21+00:00",
"how-to-use-this-packagist-mirror":"https://pkg.phpcomposer.com/",
"total-cached-packages":177423,
"total-cached-zips":"Millions"
}

/packages.json 我们称它为 入口配置 吧, 里面有一个字段 providers-includes, 我们再回头看看这个(注意%24解码后是$):

Downloading https://packagist.phpcomposer.com/p/provider-2013%2427453ee820a0c569990f0e5c705651d4902266bfb0d66ac4a8675350cc8c3dee.json

是不是很神奇, 把里面的 sha256 替换到 %hash%, 再加上域名, 就是一个下载链接.

我们把它下载到本地, 发现里面是这样的结构(由于文件太大, 所以我删掉了很多包, 理解它结构就可以了):

{
"providers":{
"2085020/api_pingdom":{
"sha256":"285e015fe97e2fa0b235f7052a9b642e41ae669c6c4b17116ae6585ebcfafa9d"
},
"3rd-party/smarty":{
"sha256":"c7bd2d6b6927649c4c200f5ff9d65cadb32af2fe3330cd698a25930224337c1a"
},
"3rd-party/yaml":{
"sha256":"d94f101c9c348f369890443aa5e6d4d5e6d911b7ecc4edcbcbc12fcb6494ed08"
}, "zucchi/pages":{
"sha256":"40cb6ea861cc93f26ed6d6de6b284e76f7aadef690e3b14529538f5af82b33f0"
}
}
}

可以看到, 里面有个 providers 字段, 字段里面有很多很多个包(我拿了前三个和最后一个), 每个包都带有一个哈希值.

OK, 答案就在这里, 上一篇文章苦苦追寻的哈希值, 其实就是在保存在这些文件里面, 它的作用大家也应该猜到了, 其实就是校验而已, 也可以说是一个版本号的功能, 当包信息有更新时, 哈希会被更新, 旧的哈希随之失效.

provider-includes 里面的 JSON, 可以理解为哈希分片信息. 从 total-cached-packages 可以知道, 一共有 177423 个包, 如果这么多的包的哈希信息保存在一个 JSON 文件当中, PHP 加载起来会很吃力, 拆成多个分片, 如果在某个分片中找到哈希, 其他分片就不需要再找了. 我实验过, 一个包只能在一个分片中出现.


总结, 一个 Composer 镜像服务器, 由 入口配置, 组件哈希, composer.json 这三部分组成. 拆开看完发现蛮简单的.

相关文章


文章来源于本人博客,发布于 2017-12-05,原文链接:https://imlht.com/archives/86/

Composer 镜像原理 (3) —— 完结篇的更多相关文章

  1. Android 实现书籍翻页效果----完结篇

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前由于种种琐事,暂停了这个翻页效果的实现,终于在这周末完成了大部分功能,但是这里只是给出了一个基本的雏形,没有添 ...

  2. IL代码完结篇

    读懂IL代码就这么简单(三)完结篇   一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在 ...

  3. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  4. Java工程师学习指南 完结篇

    Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校 ...

  5. Java工程师学习指南(完结篇)

    Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校 ...

  6. Docker基础修炼2--Docker镜像原理及常用命令

    通过前文的讲解对Docker有了基本认识之后,我们开始进入实战操作,本文先演示Docker三要素之镜像原理和相关命令. 本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境,如果你本地没有 ...

  7. 解剖SQLSERVER 完结篇 关于Internals Viewer源代码

    解剖SQLSERVER 完结篇 关于Internals Viewer源代码 大家可能都用过Internals Viewer这个软件 <查看SQLSERVER内部数据页面的小插件Internals ...

  8. (视频)《快速创建网站》 4.2 完结篇 – 应用运营vs.发射卫星,遥测(Telemetry) 技术

    本文是<快速创建网站>系列的第10篇(完结篇),如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文.访问本系列目录,请点击:http://devopshub.c ...

  9. 不就是抽个血吗,至于么-jQuery,Linux完结篇

    hi 趁着周一去抽血化验,真开心...下午报告才出来,不过早上来了就开始各种晕菜,叫错名字,说错话.....至于么.. 还有在教研室的30天就可以肥家了,凯森凯森.今天不想干活(哪天想干过我就问问), ...

  10. 直接拿来用!最火的Android开源项目(完结篇)

    直接拿来用!最火的Android开源项目(完结篇) 2014-01-06 19:59 4785人阅读 评论(1) 收藏 举报 分类: android 高手进阶教程(100) 摘要:截至目前,在GitH ...

随机推荐

  1. ray-分布式计算框架-集群与异步Job管理

    0. ray 简介 ray是开源分布式计算框架,为并行处理提供计算层,用于扩展AI与Python应用程序,是ML工作负载统一工具包 Ray AI Runtime ML应用程序库集 Ray Core 通 ...

  2. 这可能是最全面的Redis面试八股文了

    Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...

  3. 笔记七:进程间的通信(IPC通信之信号灯)

    信号量 定义信号变量:  sem_t sem1 sem2 初始化信号量 P操作           V操作    功能 信号量(POSOX) 信号量灯(IPC) 定义信号变量 sem_t  sem1 ...

  4. C# 反射 操作列表类型属性

    本文介绍对列表进行创建及赋值的反射操作 我们现在有TestA.TestB类,TestA中有TestB类型列表的属性List,如下: 1 public class TestA 2 { 3 public ...

  5. 2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。

    2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数. 答案2023-02-21: 使用 github.com/moonfdd/ffmpeg-go 库,这个库比go ...

  6. 2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。 输入: n = 5 输出: 5 解释: 下面是带

    2022-02-21:不含连续1的非负整数. 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数. 输入: n = 5 输出: 5 解释: 下面是带有 ...

  7. 2021-11-01:寻找重复数。给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数

    2021-11-01:寻找重复数.给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设 nums 只有 一个重复的整数 ...

  8. django--循环调用的解决办法

    不要导入该APP的包,而是加上双引号写入"App.xxx"

  9. es 笔记二之基础查询

    本文首发于公众号:Hunter后端 原文链接:es笔记二之基础查询 这一篇笔记介绍 es 的基础查询. 基础查询包括很多,比如排序,类似数据库 limit 的操作,like 操作,与或非等,对于这些操 ...

  10. node 代理访问服务器

    1.背景 由于在开发的过程中,我们经常需要访问测试/正式环境,会出现线上正常,本地访问不同 2.方案 方法一: 我们可以通过node作为中间件,解决这一问题.示例如下: var express = r ...