Composer在更新时意外终止

185

我遇到了一个问题,我尝试为我的Laravel 4项目安装一个新的包。 但是当我运行php composer.phar update时,会出现以下错误:

Loading composer repositories with package information
Updating dependencies (including require-dev)
Killed

我在网上寻找问题并发现内存是问题所在,我认为我没有足够的可用RAM,我已经检查了,只有约411MB可用。

Composer真的需要更多的RAM吗?

20个回答

415
“Killed”消息通常意味着您的进程消耗了过多的内存,如果可能的话,您可以简单地为系统添加更多内存。在撰写本答案时,我不得不将虚拟机的内存增加至少768MB,以便在某些情况下使“composer update”正常工作。
但是,如果您正在使用生产服务器,则根本不应该使用“composer update”。您应该执行以下操作:
1. 在本地环境(例如直接在物理笔记本电脑/台式机上或在运行在笔记本电脑/台式机上的docker容器/虚拟机中)中运行“composer update”,在那里内存限制不应该如此严格。 2. 上传或git push composer.lock文件。 3. 在生产服务器上运行“composer install”。
然后,“composer install”将从.lock文件中读取,每次获取完全相同的版本,而不是找到每个软件包的最新版本。这使您的应用程序更不容易出现故障,并且composer使用的内存更少。

阅读更多内容: https://getcomposer.org/doc/01-basic-usage.md#installing-with-composer-lock

或者,您可以将整个vendor目录上传到服务器,无需运行composer install,但是您应该运行composer dump-autoload --optimize


6
我上传了 composer.lock 并运行了 composer install,成功了。谢谢! - Ehsan
这对我不起作用,composer是通过apt安装的,所以我将其卸载并手动安装,然后一切都正常工作。 - rafaelphp
2
我在本地机器上遇到了这个问题。 - afilina
我遇到了麻烦,持续了4天,最终通过"composer dump-autoload --optimize"解决了问题。谢谢!你救了我。 - Kirit Patel
在一台安装了journalctl的Linux机器上,您可以运行journalctl | grep oom来打印与由于“内存不足”而被杀死的进程相关的日志(或者journalctl -n 1000 | grep oom仅在最后1000个日志中搜索)。在我的情况下,我有一个在Docker容器中运行的进程,其内存限制定义为256MB,并且其中的进程由于OOM而被杀死,因此我增加了容器允许的最大内存并解决了问题。 - Lucas Basquerotto
显示剩余3条评论

124

如果像我一样,你正在使用一些内存不足的微型虚拟机,创建一个交换文件就可以解决问题:

#Check free memory before
free -m

mkdir -p /var/_swap_
cd /var/_swap_

#Here, 2G ~ 2GB of swap memory. Feel free to add MORE
sudo fallocate -l 2G swapfile

chmod 600 swapfile
mkswap swapfile
swapon swapfile
#Automatically mount this swap partition at startup
echo "/var/_swap_/swapfile none swap sw 0 0" >> /etc/fstab

#Check free memory after
free -m

正如一些评论所指出的那样,如果您不是使用root身份,则不要忘记添加sudo

顺便说一句,可以自由选择文件的另一个位置/文件名/大小。
/var可能不是最好的位置,但我不知道哪个位置是最好的,并且很少关心,因为小型服务器主要用于测试目的。


@Muhammad Dyas Yaskur 如果您没有权限问题(请确保以root身份工作或使用sudo),那么您的配置中是否还有其他特殊要求(操作系统、驱动器类型等)? - Balmipour
经过我的研究,这是由于我的VPS引起的问题。请参考https://unix.stackexchange.com/questions/2893/swapon-operation-not-permitted。 - Muhammad Dyas Yaskur
使用 df -h 命令,我发现物理内存已满。 - Gennadiy Bilyk
1
最好在root模式下运行这些命令。 sudo su - dheeraj
1
@Balmipour 我使用 Laravel Homestead box
  • Homestead v10.12.0、v11.0.2
  • Settler v9.5.1 (Ubuntu 18.04)
  • Settler v10.0.0 (Ubuntu 20.04)
如果我执行 "sudo su",那么它应该可以在不使用 sudo 的情况下工作。
- Shawn Pivonka
显示剩余6条评论

27

不幸的是,Composer 更新需要大量的 RAM 和处理能力。以下是我所做的一些事情,结合起来使这个过程变得可忍受。这是在我的云沙盒环境中进行的。

  1. 你可能只是缺少 RAM。启用交换空间:https://linuxize.com/post/create-a-linux-swap-file/
  2. 使用第二个终端会话运行 top(或 htop)以监视内存/交换空间消耗,直到进程完成,您也可以提前使用它停止任何占用内存的进程。
  3. 例如:service mysql stop 将停止 mysql,但不要忘记在升级后启动它:service mysql start
  4. composer.phar update --prefer-dist -vvv(详细输出 [仍然会在工作时卡住] 并使用发行版 zip 文件)。也许也尝试一下 --dry-run

我将 top 替换为 htop,更加方便。 - DevonDahon
另外,也要考虑创建交换文件。 - Hari Harker
1
停止mysql服务后,这对我很有帮助。感谢@alirobe。 - Asad Iftikhar

22

修复DigitalOcean的方法,不需要额外的内存 - 激活交换空间,这里是1gb的示例:

在终端中运行以下命令:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1

上述解决方案可在下一次重启之前使用,之后就必须重新激活交换。要使其在重启之间持久化,请将交换文件添加到fstab中:

sudo nano /etc/fstab

打开上述文件,在文件中添加以下行:

/var/swap.1 swap swap sw 0 0

现在重新启动服务器。Composer require 运行良好。


20
我在 PHP DOCKER 容器中运行 composer install 时遇到了这个错误,这是一个内存问题。通过将 DOCKER PREFERENCES 中的 SWAP 内存从 512MB 增加到 1.5GB 来解决。
操作步骤如下: 打开 Docker -> Preferences -> Rousources。

enter image description here


将我的交换空间从1GB增加到2GB,然后它就可以工作了! - Jorge Ribeiro

15

增加Composer的内存限制

php -d memory_limit=4G /usr/local/bin/composer update

12

运行 composer self-updatecomposer clearcache,删除 vendor 和 composer.lock 文件,重新启动本地环境,然后运行 php -d memory_limit=-1 /usr/local/bin/composer install


5
如果您正在使用Docker,您可以使用COMPOSER_PROCESS_TIMEOUT
environment:
  COMPOSER_MEMORY_LIMIT: -1
  COMPOSER_PROCESS_TIMEOUT: 2000 #seconds

在大型项目中,composer 需要的 RAM 大于 2GB,你可以在运行时使用 ps -aux 命令进行检查。 你需要手动将其添加到 docker 选项中,没有其他办法。

enter image description here


Docker内存增加是关键! - PatricNox

4

以下是我如何在Laravel框架中通过composer成功安装maatwebsite\excel包的步骤:

  1. 从远程服务器下载composer.json文件和composer.lock文件。
  2. 在本地命令提示符中运行composer update命令(然后等待所有安装过程完成)。
  3. composer.lock文件上传到远程服务器。
  4. 在远程服务器上运行composer install命令(然后等待所有过程完成)。
  5. 完成

3

Composer 2 更新降低了内存使用量。

composer self-update
composer update
composer require xxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接