Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Composer 镜像原理 (3) —— 完结篇

Composer 镜像原理 (3) —— 完结篇

原创
作者头像
仁扬
发布于 2023-06-21 14:02:38
发布于 2023-06-21 14:02:38
2060
举报
文章被收录于专栏:仁扬笔记仁扬笔记
相关文章

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

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

代码语言:shell
AI代码解释
复制
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 是我们关注的重点, 看看里面有什么:

代码语言:json
AI代码解释
复制
{
    "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%, 再加上域名, 就是一个下载链接.

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

代码语言:txt
AI代码解释
复制
{
    "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 加载起来会很吃力, 拆成多个分片, 如果在某个分片中找到哈希, 其他分片就不需要再找了. 我实验过, 一个包只能在一个分片中出现.

<hr>

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

相关文章

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
composer的使用
Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。
老雷PHP全栈开发
2020/07/02
6070
【腾讯云的1001种玩法】微信个人订阅号后台server搭建入门教程
周川
2016/12/19
3.8K0
php系列一之composer的安装与使用
简单来说,composer 之于 php 相当于 maven 和 gradle 之于 java,npm 之于 nodejs,pip 之于 python,go mod 之于 golang。是 php 中的一款依赖管理的工具。
山行AI
2019/11/20
4.9K0
Composer国内镜像源设置姿势
安装composer wget curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer 设置国内镜像源姿势一 之 全局配置 composer config -g repo.packagist composer https://packagist.phpcomposer.com 设置国内镜像源姿势之一 之 单项目配置 composer config repo.packagist comp
AlicFeng
2018/08/22
1.8K0
Packagist 镜像使用方法
打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:
西里国际站
2023/04/18
1.1K0
创建个自己的composer包【工具】
1.mkdir minipay 创建个目录,cd minipay 进入目录,composer init 初始化一些包的信息
sinnoo
2020/11/13
7310
创建个自己的composer包【工具】
如何部署企业内部Composer私有Packagist仓库
正常情况使用PHP依赖包使用的都是官方公有仓库 https://packagist.org 公开可用的开源组件,但有时候如果公司使用内部开发的PHP组件,而基于许可证和安全方面的问题不能将其开源,就需要私有部署Packagist私有仓库。
Tinywan
2024/01/02
8940
如何部署企业内部Composer私有Packagist仓库
composer安装与使用
1.安装  参考  https://getcomposer.org/download/
碧海长天
2021/10/21
1.2K0
Composer安装和使用
Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们,它好比是nodejs中的npm,很轻松一个命令就可以把他人优秀的代码用到我们的项目中来,而且很容易管理依赖关系,更新删除等操作也很轻易的实现。
用户1739228
2022/08/30
1.8K0
Composer安装和使用
Composer专题-使用体会 composer install VS composer update
composer install 会根据composer.lock文件来安装依赖包,这里composer.lock占据“主导地位”,如果.lock文件不存在,将读取composer.json文件找出需要安装的包,并在处理完依赖后创建composer.lock。原文出处
躺平程序员老修
2023/09/05
2810
Composer 使用技巧简述
上述代码执行完成后, 只是下载到了 composer.phar 文件, 可以通过 php composer.phar 在任意位置执行.
Jintao Zhang
2018/08/27
1.4K0
Composer系列之四
顾名思义,使用此命令可以编辑 Composer 的一些基本设置,无论是本地的 composer.json 或者全局的 config.json 文件。
botkenni
2019/09/02
6400
各平台安装Composer
要部署一个网站,主页空间不是云主机,只有Apache,即只支持静态Html或Php。服务上,Node或Spring boot是不能用了,So sad,只好找回老工具Php,顺便安装Composer并记录下。
IT晴天
2018/08/20
1.3K0
搭建高性能的私有 Composer 镜像服务
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
soulteary
2019/09/29
1.7K1
搭建高性能的私有 Composer 镜像服务
用composer开发自定义包
7、在composer packagist提交项目,打开https://packagist.org/,点击右上角Submit,输入git地址,然后确认提交
Petrochor
2022/06/07
3200
用composer开发自定义包
Composer 镜像原理 (1) —— 初识 Composer
Composer 是 PHP 的依赖管理工具, 你可以在项目的 composer.json 文件中声明所依赖的组件, 它将自动为你安装.
仁扬
2023/06/20
3180
composer系列之五
是的,既然我们在使用一个composer扩展的时候根据一份composer.json来安装依赖包,那么我们发布扩展包的时候,也应该先有一份描述自己的清单 - composer.json。
botkenni
2019/09/03
8650
PHP如何利用Coding平台构建高效的Composer国内镜像源
Tinywan
2024/01/29
3090
PHP如何利用Coding平台构建高效的Composer国内镜像源
如何发布一个自己的Composer依赖包
Composer是 用PHP开发的用来管理项目依赖的工具,当你在项目中声明了依赖关系后,composer可以自动帮你下载和安装这些依赖库,并实现自动加载代码。
Tinywan
2024/01/02
5050
如何发布一个自己的Composer依赖包
安装yii2高级版
选择VPN或者设置composer的镜像服务器 镜像用法: 有两种方式启用本镜像服务: • 系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中。见“方法一” • 单个项目配置: 将配置信息添加到某个项目的 composer.json 文件中。见“方法二” 方法一: 修改 composer 的全局配置文件(推荐方式) 打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令: 复制
botkenni
2019/09/03
1.8K0
安装yii2高级版
相关推荐
composer的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档