为啥 Composer 中的依赖项更新如此缓慢?

Posted

技术标签:

【中文标题】为啥 Composer 中的依赖项更新如此缓慢?【英文标题】:Why updating of dependencies in composer is so slow?为什么 Composer 中的依赖项更新如此缓慢? 【发布时间】:2012-11-05 00:18:47 【问题描述】:

我正在使用 composer (http://getcomposer.org/) 来管理 Symfony2 (symfony v 2.1.3) 中已安装的包。作曲家的版本是de3188c

我有一个问题,当我将新包添加到 composer.json 并执行它时,显示有关更新依赖项的消息的时间非常少。

我在 composer.json 中有这些数据(见下文),执行时间大约是 20 分钟!!!互联网连接速度足够快,我可以非常快地下载大文件...

有什么技巧可以让它更快?


"name": "symfony/framework-standard-edition",
"description": "The \"Symfony Standard Edition\" distribution",
"autoload": 
    "psr-0":  "": "src/" 
,
"require": 
    "php": ">=5.3.3",
    "symfony/symfony": "2.1.*",
    "doctrine/orm": ">=2.2.3,<2.4-dev",
    "doctrine/doctrine-bundle": "1.0.*",
    "twig/extensions": "1.0.*",
    "symfony/assetic-bundle": "2.1.*",
    "symfony/swiftmailer-bundle": "2.1.*",
    "symfony/monolog-bundle": "2.1.*",
    "sensio/distribution-bundle": "2.1.*",
    "sensio/framework-extra-bundle": "2.1.*",
    "sensio/generator-bundle": "2.1.*",
    "jms/security-extra-bundle": "1.2.*",
    "jms/di-extra-bundle": "1.1.*",
    "doctrine/doctrine-fixtures-bundle": "dev-master",
    "webignition/doctrine-migrations-bundle": "dev-master"
,
"scripts": 
    "post-install-cmd": [
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
    ],
    "post-update-cmd": [
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
    ]
,
"minimum-stability": "dev",
"extra": 
    "symfony-app-dir": "app",
    "symfony-web-dir": "web"

【问题讨论】:

你可以做的 - 是指定需要的标签(而不是 2.1.* 使用 2.1.1 f.e.) 在 2014 年 12 月上旬,发现了一项优化,在 Composer 运行期间停止尝试垃圾收集内存。由于 Composer 中正在做一些非常具体的事情,所以花了很长时间,但最终做的很少。补丁发布后,许多人报告说 Composer 会占用更多内存,但运行时间会减少一半,甚至更少。 也尝试更新作曲家。 【参考方案1】:

尝试在 composer.json 中为每个依赖项指定一个版本,并在调用 composer 时使用选项--prefer-dist。它将从存储库(如果可用)而不是单个文件下载 ZIP 文件。

php composer.phar install --prefer-dist

【讨论】:

它显着改善了我非常简单的项目的加载时间,该项目有很多传递依赖(使用 phpunit) 它还会在 ~/.composer 中保存一份副本,以便其他项目或更新等先到那里。 似乎正是我的问题。当我在没有锁定文件的情况下运行 composer install 时,它花了大约 30 分钟。当我使用锁定文件时,它在几秒钟内完成。【参考方案2】:

由于您接受了答案,看来这解决了您的问题。以防万一其他人偶然发现这个问题(就像我在搜索时所做的那样),就我而言,一个非常慢的 Composer 安装与我的 PHP 版本有关(警告,我是一个完整的 Composer 新手) ,尽管 Composer 通过了标准检查并表示一切正常。我运行的是 Ubuntu 12.04 LTS,并且懒得从 Precise 存储库中的默认 PHP 5.3.10(您正在运行的版本)升级。

最初通过 Composer 安装 Twig 花了我大约 30 分钟。在花了一个多小时后,我放弃了安装 Doctrine。我升级到 5.4.17(使用此 PPA https://launchpad.net/~ondrej/+archive/php5)并在几秒钟内完成了 Doctrine 的安装。

【讨论】:

+1 不管 PHP 升级不是一个选项,因为接受的答案对我也不起作用。 在 PHP 5.5.9 中的运行速度也快了很多。我也听说有人在 HHVM 上使用 composer 取得了惊人的效果。 同时禁用 xdebug 似乎也有帮助。【参考方案3】:

我发现也很慢,几十分钟就慢了。

对我来说,我添加了 -vvv 并发现它挂在类似的东西上 Downloading https://packagist.org/p/provider-active$53cdf887c8d2925b3501f47d6980fb7bda2310716369bf7a84857c6e62bbab0f.json

然后我转到浏览器并尝试下载该 JSON 文件,果然如此。缓慢的原因是 packagist.org。

【讨论】:

这是我的情况缓慢的根本原因。 这似乎对我有用(不完全,但至少少了一件事)***.com/a/30716919/775941【参考方案4】:

就我而言,上述建议并没有什么不同。所做的是将HTTPS 协议用于packagist

php composer.phar config --global repo.packagist composer https://packagist.org

composer config --global repo.packagist composer https://packagist.org

取决于您的设置

【讨论】:

这对我来说非常有效。个人会将此标记为最佳答案。 非常适合我 我尝试了很多解决方案(比如禁用 xdebug、激活缓存、添加 --prefer-dist)都不起作用,偶然我得到了这个答案,这是唯一的解决方案谁真正解决问题。应该标记为我的案例的最佳答案。【参考方案5】:

为了诊断这种用法,我使用了带有 -vvv 属性的 require 命令。

composer require larapack/dd -vvv

在我的情况下,我发现 composer 速度慢是因为 fxp/composer-asset-plugin。

composer global show
composer global remove fxp/composer-asset-plugin

然后瞧

【讨论】:

以上是关于为啥 Composer 中的依赖项更新如此缓慢?的主要内容,如果未能解决你的问题,请参考以下文章

使用composer安装laravel包而不更新依赖项[重复]

在简单的逐行计算任务中,为啥犰狳与 C 风格的数组相比如此缓慢

composer update - 更新单个包时如何跳过更新依赖项

为啥我的 Haskell 代码与 Swift 和 C 相比如此缓慢 [重复]

Composer:如何在不更新旧依赖项的情况下安装另一个依赖项?

如何找出为啥 wordpress 博客加载如此缓慢