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

相关文章

上一篇文章 提到的哈希值, 将会在这篇文章揭晓, 看完这篇文章, 也将会清楚地了解 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 这三部分组成. 拆开看完发现蛮简单的.

相关文章

标签: Composer

添加新评论