繁体   English   中英

为什么 PHP Composer 这么慢?

[英]Why is PHP Composer so slow?

为什么PHP Composer这么慢,而我所做的只是初始化一个零依赖项的项目? 这是我运行的命令:

composer init

<一步一步通过composer.json创建,定义0零依赖>

composer install

等待 3 分钟(并不夸张)。

作曲家所要做的就是拉入自动加载器并创建/vendor ,那么为什么要花这么长时间呢? 就此而言,为什么composer init上没有发生该步骤?

是否有一个配置选项我可以用来在init时拉入缓存的自动加载器和供应商?

因为 Composer 是由file_get_contents()实现的。 没有 TCP 优化,没有 Keep-Alive,没有多路复用等。

我创建了一个 Composer 插件来并行下载包: https : //packagist.org/packages/hirak/prestissimo

$ composer global require hirak/prestissimo

请尝试一下。 在我的环境中, composer install速度提高了 10 倍。

  1. 确保您拥有最新版本的 Composer。
  2. 通过添加 -vvv 以详细模式安装,例如composer global require "squizlabs/php_codesniffer=*" -vvv
  3. 如果您能够找出 Composer 遇到缓慢的地方,例如我的下载包时卡住了 5 分钟。 在 50 Mbit/s 连接上下载 20 kB 文件需要 5 分钟以上。 这是因为它使用 HTTP 而不是 HTTPS 从 packagist 下载包。 对配置进行这些更改解决了我的问题: composer config --global repo.packagist composer https://packagist.org

另外,禁用Xdebug 即使运行像composer --version这样简单的命令,Xdebug 也会导致 Composer 花费几分钟的时间。

和这里一样。 使用“composer install --profile -vvv”获取更多详细信息。 就我而言,下载一些 JSON 文件需要很长时间。 它们缓存在我的服务器上,但仍然会在每次 Composer 更新/安装调用时下载。

…… 30 分钟后……

看起来像一些性能问题@packagist.org。 现在 Composer 安装在 2 秒内运行! 并且下载的 JSON 文件被正确缓存。

我遇到了这个问题,它让我陷入困境,因为我的机器上没有安装 Xdebug。 结果证明是IPv6寻址模式失败。 所以为了测试我跑了

curl --ipv4 'https://packagist.org/packages.json'
curl --ipv6 'https://packagist.org/packages.json'

IPv4 通过,但 IPv6 失败。 最后,您应该看看为什么您的网络堆栈不支持它,但就我而言,我决定只优先考虑 IPv4 流量,直到我能解决这个问题。 CentOS 上,我创建/修改了文件 /etc/gai.conf 并输入以下内容:

label       ::1/128        0
label       ::/0           1
label       2002::/16      2
label       ::/96          3
label       ::ffff:0:0/96  4
precedence  ::1/128        50
precedence  ::/0           40
precedence  2002::/16      30
precedence  ::/96          20
precedence  ::ffff:0:0/96  100

在 Ubuntu 上,您还可以编辑该文件并取消注释该行

precedence ::ffff:0:0/96  100

Rackspace 社区中心的来源

在 Ubuntu Xenial 16.04 VPS 上,您需要执行以下操作:

sudo sh -c "echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf"
composer global require hirak/prestissimo

它将 IPv4 配置为优先于 IPv6。

https://serverfault.com/questions/93717/setting-ipv4-as-preferred-protocol-over-ipv6

就我而言,我运行的作曲家版本已过时。 更新作曲家版本本身后,问题就消失了。

更新 Composer 版本运行

composer self-update

然后需要 composer 包,你就完成了。

composer require "<package-name>"

编辑:结论:此处未列出解决方案或通常似乎是防弹的。 最终有帮助的通常是增量使用 composer,使用composer require一次只需要或删除一个包, composer remove命令,还考虑添加任何“非依赖特定”设置,可以添加/删除任何库为了它更新/刷新 composer.json 锁缓存配置。

将我的经验与来自此处和相关链接的答案分组。

之前我尝试了这个问题中提到的每一个解决方案。 然而,它仍然没有帮助我,尽管我尝试/注意到安装任何其他单个库都相当快,所以我继续一个一个地调查可能导致瓶颈的库。

1)是的,我将它定位为 codeception, "codeception/codeception": "2.4.0",

单独花费了将近 200 秒,尽管与其他库一起运行它有时似乎运行了将近 12 分钟。 此外,composer 在启动 20 秒后输出它运行 0.35 秒后似乎没有反映实时,依此类推。

[374.9MiB/173.14s]     39/45:   https://codeload.github.com/sebastianbergmann/php-text-template/legacy.zip/31f8b717e51d9a2afca6c9f046f5d69fc27c8686
[374.9MiB/173.16s]     40/45:   https://codeload.github.com/sebastianbergmann/diff/legacy.zip/720fcc7e9b5cf384ea68d9d930d480907a0c1a29
[374.9MiB/173.17s]     41/45:   https://codeload.github.com/sebastianbergmann/exporter/legacy.zip/68609e1261d215ea5b21b7987539cbfbe156ec3e
[374.9MiB/173.19s]     42/45:   https://codeload.github.com/sebastianbergmann/phpunit-mock-objects/legacy.zip/f9756fd4f43f014cb2dca98deeaaa8ce5500a36e
[374.9MiB/173.20s]     43/45:   https://codeload.github.com/sebastianbergmann/recursion-context/legacy.zip/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8
[374.9MiB/173.23s]     44/45:   https://codeload.github.com/sebastianbergmann/php-code-coverage/legacy.zip/4cab20a326d14de7575a8e235c70d879b569a57a
[374.9MiB/173.24s]     45/45:   https://codeload.github.com/doctrine/instantiator/legacy.zip/ae466f726242e637cebdd526a7d991b9433bacf1
[374.9MiB/173.24s]     Finished: success: 45, skipped: 0, failure: 0, total: 45
[374.8MiB/173.25s] Analyzed 6622 packages to resolve dependencies
[374.8MiB/173.25s] Analyzed 435842 rules to resolve dependencies
[374.8MiB/173.25s] Package operations: 54 installs, 0 updates, 0 removals
[374.8MiB/173.26s] Installs: sebastian/recursion-context:3.0.0, sebastian/exporter:3.1.2, doctrine/instantiator:1.3.0, phpunit/php-text-template:1.2.1, phpunit/phpunit-mock-objects:6.1.2, codeception/stub:1.0.4, sebastian/diff:3.0.2, sebastian/comparator:3.0.2, theseer/tokenizer:1.1.3, sebastian/version:2.0.1, sebastian/environment:3.1.0, sebastian/code-unit-reverse-lookup:1.0.1, phpunit/php-token-stream:3.1.1, phpunit/php-file-iterator:1.4.5, phpunit/php-code-coverage:6.0.5, sebastian/object-reflector:1.1.1, sebastian/object-enumerator:3.0.3, sebastian/global-state:2.0.0, phpunit/php-timer:2.1.2, symfony/polyfill-ctype:v1.17.0, webmozart/assert:1.8.0, phpdocumentor/reflection-common:2.1.0, phpdocumentor/type-resolver:1.1.0, phpdocumentor/reflection-docblock:5.1.0, phpspec/prophecy:v1.10.3, myclabs/deep-copy:1.9.5, sebastian/resource-operations:1.0.0, phar-io/version:1.0.1, phar-io/manifest:1.0.1, phpunit/phpunit:7.1.5, codeception/phpunit-wrapper:7.6.1, symfony/yaml:v4.4.8, behat/gherkin:v4.6.2, symfony/polyfill-mbstring:v1.17.0, symfony/dom-crawler:v4.4.8, symfony/css-selector:v4.4.8, symfony/browser-kit:v4.4.8, symfony/event-dispatcher-contracts:v1.1.7, psr/container:1.0.0, symfony/event-dispatcher:v4.4.8, symfony/service-contracts:v2.0.1, symfony/polyfill-php73:v1.17.0, symfony/console:v4.4.8, symfony/finder:v4.4.8, ralouphie/getallheaders:3.0.3, psr/http-message:1.0.1, guzzlehttp/psr7:1.6.1, guzzlehttp/promises:v1.3.1, symfony/polyfill-php72:v1.17.0, symfony/polyfill-intl-idn:v1.17.0, guzzlehttp/guzzle:6.5.3, symfony/process:v4.4.8, facebook/webdriver:1.7.1, codeception/codeception:2.4.0
[374.8MiB/173.28s]   - Installing sebastian/recursion-context (3.0.0): [374.9MiB/173.28s] Loading from cache[374.9MiB/173.28s]
[374.9MiB/173.28s]  Extracting archive[374.9MiB/173.51s]   - Installing sebastian/exporter (3.1.2): [374.9MiB/173.52s] Loading from cache[374.9MiB/173.52s]
[374.9MiB/173.52s]  Extracting archive[374.9MiB/173.75s]   - Installing doctrine/instantiator (1.3.0): [374.9MiB/173.76s] Loading from cache[374.9MiB/173.76s]
[374.9MiB/173.76s]  Extracting archive[374.9MiB/174.00s]   - Installing phpunit/php-text-template (1.2.1): [374.9MiB/174.00s] Loading from cache[374.9MiB/174.00s]
[374.9MiB/174.00s]  Extracting archive[374.9MiB/174.23s]   - Installing phpunit/phpunit-mock-objects (6.1.2): [374.9MiB/174.23s] Loading from cache[374.9MiB/174.23s]
[374.9MiB/174.23s]  Extracting archive[374.9MiB/174.55s]   - Installing codeception/stub (1.0.4): [374.9MiB/174.56s] Loading from cache[374.9MiB/174.56s]
[374.9MiB/174.56s]  Extracting archive[374.9MiB/174.80s]   - Installing sebastian/diff (3.0.2): [374.9MiB/174.80s] Loading from cache[374.9MiB/174.80s]
[374.9MiB/174.80s]  Extracting archive[374.9MiB/175.07s]   - Installing sebastian/comparator (3.0.2): [374.9MiB/175.07s] Loading from cache[374.9MiB/175.07s]
[374.9MiB/175.07s]  Extracting archive[374.9MiB/175.33s]   - Installing theseer/tokenizer (1.1.3): [374.9MiB/175.33s] Loading from cache[374.9MiB/175.33s]

之前的运行

 Problem 1
    - Installation request for codeception/codeception 2.4.0 -> satisfiable by codeception/codeception[2.4.0].
    - Conclusion: remove symfony/finder v5.0.8
    - Conclusion: don't install symfony/finder v5.0.8
    - codeception/codeception 2.4.0 requires symfony/finder >=2.7 <5.0 -> satisfiable by symfony/finder[v2.7.0, v2.7.1, v2.7.10, v2.7.11, v2.7.12, v2.7.13, v2.7.14, v2.7.15, v2.7.16, v2.7.17, v2.7.18, v2.7.19, v2.7.2, v2.7.20, v2.7.21, v2.7.22, v2.7.23, v2.7.24, v2.7.25, v2.7.26, v2.7.27, v2.7.28, v2.7.29, v2.7.3, v2.7.30, v2.7.31, v2.7.32, v2.7.33, v2.7.34, v2.7.35, v2.7.36, v2.7.37, v2.7.38, v2.7.39, v2.7.4, v2.7.40, v2.7.41, v2.7.42, v2.7.43, v2.7.44, v2.7.45, v2.7.46, v2.7.47, v2.7.48, v2.7.49, v2.7.5, v2.7.50, v2.7.51, v2.7.6, v2.7.7, v2.7.8, v2.7.9, v2.8.0, v2.8.1, v2.8.10, v2.8.11, v2.8.12, v2.8.13, v2.8.14, v2.8.15, v2.8.16, v2.8.17, v2.8.18, v2.8.19, v2.8.2, v2.8.20, v2.8.21, v2.8.22, v2.8.23, v2.8.24, v2.8.25, v2.8.26, v2.8.27, v2.8.28, v2.8.29, v2.8.3, v2.8.30, v2.8.31, v2.8.32, v2.8.33, v2.8.34, v2.8.35, v2.8.36, v2.8.37, v2.8.38, v2.8.39, v2.8.4, v2.8.40, v2.8.41, v2.8.42, v2.8.43, v2.8.44, v2.8.45, v2.8.46, v2.8.47, v2.8.48, v2.8.49, v2.8.5, v2.8.50, v2.8.52, v2.8.6, v2.8.7, v2.8.8, v2.8.9, v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7, v3.0.8, v3.0.9, v3.1.0, v3.1.1, v3.1.10, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8, v3.1.9, v3.2.0, v3.2.1, v3.2.10, v3.2.11, v3.2.12, v3.2.13, v3.2.14, v3.2.2, v3.2.3, v3.2.4, v3.2.5, v3.2.6, v3.2.7, v3.2.8, v3.2.9, v3.3.0, v3.3.1, v3.3.10, v3.3.11, v3.3.12, v3.3.13, v3.3.14, v3.3.15, v3.3.16, v3.3.17, v3.3.18, v3.3.2, v3.3.3, v3.3.4, v3.3.5, v3.3.6, v3.3.7, v3.3.8, v3.3.9, v3.4.0, v3.4.1, v3.4.10, v3.4.11, v3.4.12, v3.4.13, v3.4.14, v3.4.15, v3.4.16, v3.4.17, v3.4.18, v3.4.19, v3.4.2, v3.4.20, v3.4.21, v3.4.22, v3.4.23, v3.4.24, v3.4.25, v3.4.26, v3.4.27, v3.4.28, v3.4.29, v3.4.3, v3.4.30, v3.4.31, v3.4.32, v3.4.33, v3.4.34, v3.4.35, v3.4.36, v3.4.37, v3.4.38, v3.4.39, v3.4.4, v3.4.40, v3.4.5, v3.4.6, v3.4.7, v3.4.8, v3.4.9, v4.0.0, v4.0.1, v4.0.10, v4.0.11, v4.0.12, v4.0.13, v4.0.14, v4.0.15, v4.0.2, v4.0.3, v4.0.4, v4.0.5, v4.0.6, v4.0.7, v4.0.8, v4.0.9, v4.1.0, v4.1.1, v4.1.10, v4.1.11, v4.1.12, v4.1.2, v4.1.3, v4.1.4, v4.1.5, v4.1.6, v4.1.7, v4.1.8, v4.1.9, v4.2.0, v4.2.1, v4.2.10, v4.2.11, v4.2.12, v4.2.2, v4.2.3, v4.2.4, v4.2.5, v4.2.6, v4.2.7, v4.2.8, v4.2.9, v4.3.0, v4.3.1, v4.3.10, v4.3.11, v4.3.2, v4.3.3, v4.3.4, v4.3.5, v4.3.6, v4.3.7, v4.3.8, v4.3.9, v4.4.0, v4.4.1, v4.4.2, v4.4.3, v4.4.4, v4.4.5, v4.4.6, v4.4.7, v4.4.8].
    - Can only install one of: symfony/finder[v2.7.0, v5.0.8].
    - Can only install one of: symfony/finder[v2.7.1, v5.0.8].
    - Can only install one of: symfony/finder[v2.7.10, v5.0.8].
    - Can only install one of: symfony/finder[v2.7.11, v5.0.8].

2) 是的顺便说一句,我提到的 prestissimo 已经应用,它似乎有帮助,因为在另一台非常快速的计算机上,它的互联网速度更快,无需编码,安装时间多 5 倍,518 秒,而这可能是由于 prestissimo 或其他建议在这里,花了 110 秒。

composer global require hirak/prestissimo

3) 是的Windows 很慢,从 Windows 到 Linux 的虚拟化文件夹也是如此。 在 Linux 内部的共享文件夹之外运行似乎可以将速度提高两倍。 虽然它可能是由于缓存。

4) 否

    "process-timeout": 1800,

是像 git checkout 这样的单个进程,即使设置为 10 似乎也没有帮助,因为它已经相当大了。 它可能只有在某些服务完全中断时才有帮助。

5) YES安装删除供应商文件夹或清空 = 新鲜似乎比添加到供应商文件和其中存在的其他包要快得多(大约 1 分钟或更长时间)

6) YES在没有 xdebug 自己的映像的 Ubuntu18 apache2 上似乎比在 Debian10 php-fpm 上慢,即使在 Yii2-starter-kit 上使用 xdebug ,由于某种原因,速度大约慢了两倍, cat /etc/*-release以找出 Linux分配

7) 没有php -ddefault_socket_timeout=1 /usr/local/bin/composer --verbose --profile install在这里提到的似乎没有帮助缓慢更新作曲家依赖项,尽管 --prefer-dist 标志也没有提到 IP v6 v v4 协议虽然它可能是由于缓存。

8) 不安装 zip 似乎没有帮助,PHP 安装已经预装了 zip,它仍然抱怨直到作为 Linux 包安装时才存在,但它使单个模拟中的进程从 650 秒到 750 秒慢了 100 秒。 相同的环境条件。 As there is no 'unzip' command installed zip files are being unpacked using the PHP zip extension https://stackoverflow.com/a/51208804/3419535无缓存条件测试--no-cache

9) YES删除"minimum-stability ": "dev",

10) 是使用prefer-dist composer require robmorgan/phinx:@dev --prefer-dist -vvv --profile (以require命令为例,使用上面首先提到的部分require命令,而不是完整安装通过安装命令,似乎是最显着的加速之一,此外还需要@dev- 与前面提到的一样,当minimum-stability: dev不一般应用于所有依赖项似乎在每个案例(依赖项)基础上使用是无害的)

如果之前的任何答案都不起作用,请检查您的防火墙是否允许端口 9418 上的 TCP_OUT。

我的防火墙安全性太强了。 这导致 Composer 需要很长时间,我从未收到任何超时或端口被阻塞的迹象。

由于防病毒软件,我在下载 json 文件时速度很慢。 一些防病毒软件会扫描所有网络流量,并且在分析 json 文件时可能会很慢。 尝试在运行 Composer 时禁用您的 AV。

第1步

$ composer self-update

第2步

$ composer clear-cache

第 3 步

$ composer update

我找到了另一个可能的解决方案,问题是您的环境中缺少cUrl扩展名。所以请按照以下步骤操作

  1. 首先,检查您是否可以访问

    packagist.orgping packagist.org 。如果您从服务器收到回复,您就可以进行下一步了。

  2. 使用composer diagnose检查 cUrl 扩展是否存在,对我来说,我得到了这些结果,表明我没有cUrl扩展,因此它可能会降低下载过程中的性能在此处输入图片说明

  3. 根据您环境的 php 版本安装 curl,我的是 8,所以sudo apt-get install php8.0-curl对我sudo apt-get install php8.0-curl

  4. 安装 cUrl 后,请检查它是否再次安装composer diagnose ,我得到了这些结果,描述了 cUrl 版本。 在此处输入图片说明

  5. 这解决了我的 Composer 在安装软件包时变慢的问题。

我在 2 个不同的项目上打开了 2 个 PHPStorm windows,第一个项目运行速度很快,第二个项目运行速度很慢,作曲家安装和作曲家启动时,我整天都在安装。 powershell window 有同样的问题。 当我关闭第一个项目时,composer start 在第二个项目中运行良好。

找出答案的最佳方法是详细地运行 composer update/install。 作曲家 {安装/更新} -vvv。 使用标志 -h 可能会在将来对您有所帮助

以防万一,如果您删除了 composer.lock 文件,然后进行composer install下载依赖项会变得太慢。 如果是这种情况,请使用composer update命令,然后它可能会帮助您或其他人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM