【问题标题】:PHP composer exhausting memory... Why? What is happening?PHP作曲家耗尽内存......为什么?怎么了?
【发布时间】:2020-10-09 17:50:55
【问题描述】:

尝试初始化 PHP/Laravel 项目(通过运行 composer install),我遇到了与此处描述的完全相同的问题:Where to find this Client.php laravel

我尝试通过使用composer require 来升级与较新的 PHP 版本交互不佳的包,并尝试升级有问题的包,但它并不顺利:

$ composer require sentry/sentry-laravel:1.8.0
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/Cellar/composer/1.10.7/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/Cellar/composer/1.10.7/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.

我在文档中阅读了如何增加内存限制(是的 - 最容易通过在运行 composer 之前设置 COMPOSER_MEMORY_LIMIT 环境变量,就像很多人提到的那样),但在我这样做之前,我想了解的是项目有问题耗尽 1536Mb 内存限制,如果是,如何理解和解决问题?更具体地说,这个命令除了替换composer.json 文件中的版本要求之外还有什么作用?如果我只是手动编辑composer.json 文件,然后从干净的表中运行compose install(在擦除vendor/ 目录以及写入项目目录的任何其他内容之后),可能会出现什么问题 - 版本会与检测到的其他依赖项冲突吗?

【问题讨论】:

  • 如果你把它放在composer.json,它可以工作吗?尝试删除供应商目录和composer install。 composer.json 中有更新后的脚本吗?
  • 我没有“为什么”的解决方案,但您可以通过在 CLI 命令中添加“环境变量”来缓解这种情况:COMPOSER_MEMORY_LIMIT=-1 composer ...
  • 您的设置没有问题。只是composer实际上需要大量内存来解析整个依赖树。
  • stackoverflow.com/a/62043521/2188922这个答案可能会给你一些指导如何安排交换来克服这个问题
  • @TimeLewis... 当然,看起来很明显,但我不敢这样做,因为我也需要使用计算机(Mac)进行其他工作,并且几乎拥有 16gb 的 RAM即使没有这样的尝试,今天也已经筋疲力尽,SSD 几乎已满,造成巨大的垃圾。

标签: php laravel composer-php


【解决方案1】:

更具体地说,除了替换composer.json 文件中的版本要求之外,此命令还有什么作用?

它还尝试安装新版本的依赖项,为此它需要检查这是否可行(新版本不与其他依赖项冲突)以及还需要做什么(安装/升级子依赖项)。在实践中,这意味着完全重建依赖树,这是一个复杂的过程,需要大量的内存。

手动编辑composer.json不会给你任何东西,因为它不会安装这个依赖。您仍然需要运行 composer update 来执行此操作,这将需要重建依赖树并导致与 require 命令相同的内存问题。

【讨论】:

  • 我忘了解释显而易见的,在编辑文件后从干净的表中重新运行compose install...(我可能稍后会尝试这个,写这个问题是为了了解背景这次失败。)
  • (用于构建和检查依赖图的 1.6Gb 似乎很简单,我不明白为什么会发生这种情况。)
  • 据我了解,composer update 将更新所有软件包,对于在生产环境中运行的具有数十万用户的应用程序,我不想这样做。并非没有全面测试。
  • composer install 将安装来自composer.lock 的依赖项(之前为旧composer.json 计算),因此您在composer.json 中的更改将被忽略。 composer update 在这种情况下确实是个坏主意,我提到它只是为了指出手动编辑 composer.json 不会帮助解决内存问题。
  • 您可以尝试将composer更新到最新版本:2.0分支在内存消耗方面有一些很大的改进。
【解决方案2】:

当我遇到这样的问题时,我暂时让composer拥有无限内存:

COMPOSER_MEMORY_LIMIT=-1 composer require sentry/sentry-laravel:1.8.0

【讨论】:

    【解决方案3】:

    尝试删除您的供应商文件,然后继续 composer install

    【讨论】:

    • 作者说他的作曲家内存不足,这是很常见的情况。删除供应商目录将无济于事。
    • 这个答案显然遗漏了一些细节。
    • 删除供应商目录(以及出现在composer install 之后的任何内容)+ 编辑compose.json + 再次运行composer install 是我希望再次处理此问题时想要尝试的方法。我想你和我想的一样。
    • 请在您的答案中添加一些解释,以便其他人可以从中学习 - 为什么要提供不同的体验?
    猜你喜欢
    • 2011-10-01
    • 2021-10-10
    • 2014-01-12
    • 2013-07-06
    • 2015-10-01
    • 2023-03-19
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多