为什么PHP Composer这么慢?


99

当我只做一个零依赖项的项目时,为什么PHP Composer这么慢?这是我运行的命令:

composer init

<逐步创建composer.json,定义0个零依赖项>

composer install

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

作曲家所要做的就是拉入自动装带器并创建/vendor,为什么要花这么长时间?就此而言,为什么不继续执行此步骤composer init

我是否可以使用配置选项来插入缓存的自动加载程序和供应商init


1
更严重的是:您在最近30天内更新了作曲家吗?上个月,代码有了重大的性能改进
Mark Ba​​ker

我在compose install5分钟前开始,但尚未完成。Composer version 1.0-dev (07c644ac229a21df80180598d8bb9aaba232eecb) 2015-02-03 12:51:10。也许它不是最新版本,但仍比您的IBM大型机更新;-)
axiac 2015年

请确认您已完成composer self-update
sjagr

我已经在上个星期左右更新了它。
AgmLauncher

我为作曲家更新和作曲家自我更新的速度异常缓慢而苦苦挣扎。花费超过15分钟的时间,然后引发异常。我更改了路由器的DNS服务器(从Google更改为ISP的DNS服务器),并且作曲家的工作像个魅力。
Gordon Hickley 2015年

Answers:


43

另外,禁用Xdebug。Xdebug可能导致Composer花费数分钟,即使运行像这样的简单命令也是如此composer --version


1
原来这是我的问题。Xdebug使作曲家的运行速度极慢。
AgmLauncher '17

请尝试使用hirak / prestissimo。它是一个作曲家插件,可帮助您快速下载软件包。 链接
Ritesh Chitrakar

3
在撰写本文时,无论是否调试,我都具有相同的性能,因为在2020/2019年,composer在运行时会自动禁用xdebug,尽管安装yii2-starter-kit花费了大约200秒安装了所有库xdebug,因此此回复已过时
FantomX1

看到了,启动了我的调试器。发现即使xdebug仅配置为FPM,CLI还是启动了它,而我的IDE却坐在一个断点等待着我。命中继续和作曲家踢右后卫。
ppostma1

377

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

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

$作曲家全球需要hirak / prestissimo

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


哇,我从124秒安装一个新的laravel项目缩短到21秒。爱它!
–cornips

7
好消息:这显然是在2019年1月合并到Composer 2中:github.com/composer/composer/pull/7904
Chuck Le Butt

@ChuckLeButt,但仍然无法看见:(
hejdav

谢啦兄弟。它快20倍。
Ilyas karim

61
  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

3
我是作曲者的新手,请尝试解决此问题2天,在阅读您的评论并添加-vvv之后,终于可以了。1000 upvotes
伊郑氏

#3为我解决了。你现在是我的英雄。现在很长一段时间都担心为什么它这么慢并且只能在某些Internet连接上工作。谢谢!
安德烈亚斯·尚特

composer config --global repo.packagist composer https://packagist.org 那是什么!太棒了!🏆
仙人Kulshreshtha

13

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

... 30分钟后...

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


1
“它们被缓存在我的服务器上,但在每次作曲家更新/安装电话中仍会下载”!您找到解决此问题的方法了吗?我的连接速度很慢,看到它真可怕。
lud

9

我遇到了这个问题,由于没有在计算机上的任何位置安装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社区中心的信息


仅作说明,这似乎对我个人没有帮助,尽管我将不得不重新模拟它以确认所有选项,其中可能是原因。
FantomX1

@ FentomX1很抱歉听到这个消息。这就是为什么我将测试放在首位的原因。如果您同时进行两个卷曲测试并且都在连接,那么显然,由于网络设置正确,因此不应进行更改。
亚伦·张伯伦

1
找到了一段简短的YouTube视频,展示了如何在Windows 10上执行此操作。它解决了我的问题。youtube.com/watch?v=63Lt_vlNWLc
马库斯(Marcus)

5

在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。

/server/93717/setting-ipv4-as-preferred-protocol-over-ipv6


自从我安装了prestissimo之后,我的作曲家的速度就非常好。
Big Tree

3
我可以确认该解决方案甚至适用于ubuntu 18.04LTS
mwangaben

请在回答中添加一些解释,以便其他人可以从中学习。第一行是做什么的?
Nico Haase

@NicoHaase如果您查看时间戳,此答案实际上是对我描述的问题的答复,但他们没有将其作为评论。无论如何,我将其合并到我的答案中。包装专家似乎更喜欢使用IPV6,但是某些网络仍然不能很好地使用它。第一行可以使您的Linux机器更喜欢IPv4地址,并优先查找这些地址。
亚伦·张伯伦

1

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

要更新作曲家的版本,请运行

composer self-update

然后需要composer软件包就可以了。

composer require "<package-name>"

须藤?根 ?为什么呢?
Mohamed Elbahja

抱歉,如果您有权限问题,请添加sudo。
sh6210

还是应该修复文件模式和所有者/组权限?而不是只运行SUDO!不知道那意味着什么?绝对不是一个FIX。
Mohamed Elbahja

当然,您可以通过运行“ chown”命令来解决所有者/组权限问题,但是您可以一次性完成此操作。我的主要目的是从我的角度以最简单的方式显示解决方案。但是,很抱歉我的话对您没有任何意义。
sh6210

@ sh6210使用作曲家时请勿鼓励使用sudo。假设存在“可能”的permission问题就是偏见。
dbf

0

如果以上任何一个答案都不起作用,请检查防火墙是否在端口9418上允许TCP_OUT。

我的防火墙安全性太高了。这导致Composer花费了很长时间,我再也没有超时或表明端口被阻塞。


更新期间您的处理器是否忙?
叶夫根尼·阿凡纳西耶夫

0

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


0

编辑:结论:这里没有列出解决方案,或者总体上似乎不是防弹方案。最终的帮助通常是逐步使用composer,使用composer require,一次仅要求或删除一个软件包composer remove,也要考虑添加任何“非依赖特定”设置,为了更新/更新,可以添加/删除任何库。刷新composer.json锁定缓存配置。

将我的经验与此处以及相关链接的答案分组。

在此之前,我尝试过此问题中提到的每个解决方案。但是,它仍然没有帮助我,尽管我尝试/注意到安装任何其他单个库的速度都非常快,所以我继续逐个研究可能导致瓶颈的库。

1)是的,我把它定位为代码接收,"codeception/codeception": "2.4.0",

仅花费了将近200秒,尽管有时将它与其他库一起运行似乎要运行12分钟。此外,在启动20秒后,作曲家似乎输出实时信号0.35s,以此类推。

[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这样的进程,似乎并没有帮助,甚至设置为10s,因为它已经很大了。仅当某些服务完全中断时,它才有帮助。

5)是,将供应商文件夹删除或为空=重新安装似乎比添加到供应商文件和其中的其他软件包要快得多(大约1分钟或更长时间)

6)在没有xdebug自己映像的Ubuntu18 apache2上,YES似乎比在Debian10 php-fpm上甚至在Yii2-starter-kit上带有xdebug都要慢,出于某种原因,cat /etc/*-release要发现Linux发行版要慢两倍。

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

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)是删除 "minimum-stability ": "dev",

10)是,请使用Preferred-dist composer require robmorgan/phinx:@dev --prefer-dist -vvv --profile (例如,使用require命令作为示例,如上文所述,使用部分require命令,而不是通过install命令进行完整安装,这似乎是最重要的加速方法之一,此外还要求使用@与以前的观点一样,当minimum-stability: dev未按一般情况应用于所有依赖项时,按情况(依赖项)使用似乎无害)


这与给定的问题有什么关系?根据问题描述,OP操作问题中没有列出任何依赖项
Nico Haase

这个问题应该从总体上解决,我试图总结所有对我有帮助的问题,并从其他地方添加其他一些解决方案。不仅仅是问询者所要求的,这里还有成千上万的其他用户场景。Composer需求基本上只是composer安装的一部分。仅仅因为我在响应中还使用了一个单词/命令“ require”,并不意味着它也不适用于安装,但是如果您希望我可以删除该单词。“没有列出单个依赖项”,而是它的方式。改变任何东西,作曲家的安装只不过是依赖。
FantomX1

几分钟后,我从1分变成-1,因为我回答了你,也许是因为你以前投票赞成我。告诉我,选择的答案prestistimo或使用ipv 6或禁用xdebug也不是通用的,并且不适用于具体的作曲家require命令。我为匆忙的修改而道歉,但我也将其用作个人Wiki,我什至没有列出具体的虔诚名称,但会进行调整。如果您不喜欢我做错字,请提一下,但不要泛型没有道理。我使用“ require”命令作为参考,因为使用“ require”是解决方案本身之一。
FantomX1

1
OP询问为什么Composer的依赖关系为零会很慢-即使您的工作清单在很多其他情况下都可能会有所帮助,但我认为与给定的问题没有关系
Nico Haase

2
Prestissimo甚至在需求列表为空的情况下也可以提供帮助-不管依赖项列表如何,作曲者都会下载一些文件,因此并行下载在这里也有帮助。
rob006


-1

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


请对此进行解释。OP使用完全空的依赖项列表运行测试
Nico Haase

-1

万一,如果您删除了composer.lock文件,然后又删除了composer install依赖关系,那就太慢了。如果是这种情况,请使用composer update命令,它可能会对您或其他人有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.