作曲家更新失败——内存不足

在我的 VM 上运行 composer.phar update时出现了这个错误:

PHP 致命错误: 在第179行的 phar:///bin/poser.phar/src/Composer/Util/RemoteFilesystem.PHP 中,允许内存大小为1073741824字节(尝试分配144115188075867549字节)

如有需要,composer.json:

{
"description" : "The CodeIgniter framework",
"name" : "codeigniter/framework",
"license": "MIT",
"require": {
"php": ">=5.2.4",
"videlalvaro/php-amqplib": "2.5.*"
},
"require-dev": {
"mikey179/vfsStream": "1.1.*",
"videlalvaro/php-amqplib": "2.5.*"
}
}

VM 刚刚从一个坏的磁盘扇区问题中恢复过来,负责 VM 的人说 VM 已经被移动到一个新的磁盘上了。在我的虚拟机中只有 Java、 PHP、 httpd、 postgre、 rabbitmq 和网站本身,在这之前它已经完美运行了大约4个月。我使用的是 PHP 5.6.11。有人能帮忙吗?

131296 次浏览

这是内存问题,不是存储问题。 您正在达到 PHP 内存限制。

编辑/etc/php.ini 并增加内存限制(memory _ limit = 128M 替换为 memory _ limit = 256M)

我建议您寻找作曲家使用如此多内存的原因,并找到减少 PHP 内存使用量的方法:

  1. 如果你还没有升级到 PHP56
  2. 安装 Zend Opcache (在不同实例之间共享 PHP 内存)
  3. 卸载所有未使用的 PECL 扩展

这就是你遇到的问题: https://github.com/composer/composer/issues/1898

通过删除整个供应商文件夹,然后再次进行作曲家更新,解决了这个问题,不知怎么的,它工作了。我甚至不明白:

检查 作曲家的故障排除 wiki,特别是内存限制错误部分。

例如,像这样运行作曲家:

php -d memory_limit=-1 `which composer` update

我不会再出错了。因此,这可能是一个内存不足的问题,可以在不改变默认 PHP 配置的情况下内联解决。

上面的命令所做的是将 PHP CLI 内存限制设置为“无限”(即。-1)然后运行内联 composer update命令。

请注意,您可能应该使用 composer.phar PHP 脚本的实际路径来代替 哪位作曲家。内联编写的 which composer(如我上面的例子)将内联解决到您的 composer.phar完整路径(您可以使用任何您喜欢的形式)。

注意 : 如果超出了物理和虚拟内存,上述解决方案也可能失败。如果是这种情况,那么显而易见的解决方案将是 增加系统的虚拟内存,然后再试一次。

sudo php -d memory_limit=-1 bin/magento setup:di:compile

解决我问题的唯一办法就是这么做:

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

参考资料: 作曲家故障排除

根据我的经验,来自作曲家的内存错误通常意味着它花费了太多的内存来寻找要安装的正确的软件包组合,特别是版本限制不够具体。例如,^ 5.2.4匹配5.3到5.3.29,5.4到5.4.45,等等。对于每个特定的版本和排列,编写器必须获取包的依赖关系,以检查是否满足所有约束。这通常是内存消耗变得巨大的时候。

一旦解决了版本问题,安装阶段将使用更少的内存。每个包的解析版本也存储在 comper.lock 文件中,以便安装的特定排列可以在其他环境中复制。这是你问题的潜在解决方案:在您的开发计算机中运行组合器更新(应该有足够的内存) ,部署更新后的 comper.lock,并在服务器上运行组合器安装。

Composer install 将始终引用现有的 poser.lock 来为每个包安装版本,因此很少会遇到内存问题。

有关如何在 comper.json 中表示版本约束的参考,请查看 https://getcomposer.org/doc/articles/versions.md

在我的例子中,我面临这个错误是因为在流浪箱中运行 composer install。在我的主机上运行它不会导致问题。

内存限制错误

作曲家有时可能会在某些命令上失败,如下消息:

PHP 致命错误: 允许内存大小 XXXXXX 字节耗尽 < ... >

或者对我来说:

致命错误: 内存不足(已分配1116733440)(试图分配 134217728字节)在 phar://C:/ProgramData/ComposerSetup/bin/poser.phar/src/Composer/DependencyResolver/Pool.php 在339号线上

在这种情况下,应该增加 PHP memory_limit

注意: 作曲家在内部将 memory_limit增加到 1.5克。

若要获取当前 memory_limit值,请运行:

php -r "echo ini_get('memory_limit').PHP_EOL;"

尝试增加 php.ini文件中的限制(例如,针对 Debian 类系统的 /etc/php5/cli/php.ini) :

; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1

作曲家还遵守由 COMPOSER_MEMORY_LIMIT环境变量定义的内存限制:

COMPOSER_MEMORY_LIMIT=-1 composer.phar <...>

或者,可以使用命令行参数来增加限制:

php -d memory_limit=-1 composer.phar <...>

这个问题也可能发生在 cPanel 实例上,当 shell fork 炸弹保护被激活时。有关更多信息,请参见 cPanel 站点上的 fork Bomb 特性的 文件


要获取加载的 php.ini 文件位置,请尝试:

php --ini

来源: (作曲家 医生)

您还可以通过删除供应商目录并重新执行编写器安装命令来解决这个问题。

卡提亚克的回答起作用了,但我不得不修改它。您将需要4GB 的空闲空间,以便在 Linux 机器上运行该程序。如果你不是 root 用户,请确保你的命令是 sudo:

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

Composer 为某些存储库(如 Drupal)占用大量内存。

从本质上说,这将从硬盘驱动器创建4 GB 的交换内存,CPU 可以使用这些内存来完成编写器命令。

最初的解决方案似乎来自这个 Github 帖子,但我可能弄错了:

Https://github.com/composer/composer/issues/7348#issuecomment-414178276

要在引导时加载交换机,请在 /etc/fstab中添加以下代码行

/var/swap.1 none swap sw 0 0

为了安全起见,您可能需要备份 fstab文件。

要回收交换空间,请执行以下操作:

sudo swapoff -v /var/swap.1
sudo rm /var/swap.1

如果你打开掉包后收到这样的信息..。

swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.

如果合适的话,更改许可

sudo chmod 600 /var/swap.1

我在一台 Windows 机器上,尝试了这个问题的所有答案,但没有一个有效。对我来说,它终于工作后,我运行作曲家 使用64位版本的 PHP

要使用 PHP x64的本地副本运行作曲家,可以执行以下操作:

  1. 从这里下载 zip 文件(我使用的是 VC15x64ThreadSafe 版本) : https://windows.php.net/download
  2. 解压文件
  3. 复制 php.ini-development 并将其重命名为 php.ini
  4. 取消注释 extension_dir = "ext"行和任何其他需要的 php 扩展(如 extension=gd2extension=openssl)。如果更新需要其他 PHP 扩展,它会在运行命令时告诉您。

工作指挥:

"C:\path\to\php-7.2.23-Win32-VC15-x64\php.exe" -d memory_limit=-1 "C:/path/to/composer.phar" update

资料来源: https://ourcodeworld.com/articles/read/816/how-to-solve-composer-install-update-error-virtualalloc-failed-0x00000008

尝试增加活动 php.ini 文件中的 memory _ limit 值。

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 512M

比如说。

除了把 memory_limit = -1放到 php.ini文件中,没有什么对我有用。

这个方法可以解决你的问题。

更新 php.ini 文件,然后重新启动 Apache 或服务器 例如: Memory _ limit = 128M 到 Memory _ limit = 1128M

这是我的工作。

php -d memory_limit=-1 /usr/local/bin/composer update --no-scripts

memory_limit=-1用于此进程的无限内存 当你为了无限的内存而在编写器之前添加 php 时,你必须给编写器一个完整的路径,它安装在服务器上(对于 ubntu)它的 /usr/local/bin/composer 剩下的部分就是编译器命令的更新/安装

增加 php.ini上的 memory_limit值并没有解决我的问题。 我所做的是:

  1. 删除作曲家,锁定,
  2. 运行作曲家更新,

成功了!

php -d memory_limit=-1 /usr/local/bin/composer install

这是我的命令。

既可以在本地环境中工作,又可以在容器(例如,在管道的构建阶段)中工作的解决方案是

COMPOSER_MEMORY_LIMIT=-1 composer install

我在我的 php.ini 文件中设置 memory _ limit =-1,但是没有工作,但是我继续执行下面链接中的命令,然后运行作曲家 install,结果非常好

Https://tecadmin.net/enable-swap-on-ubuntu/

我没有永久性地将你的记忆限制设置为增加的数量(或无限的) ,而是使用了这个;

# Running an update
COMPOSER_MEMORY_LIMIT=-1 composer update
COMPOSER_MEMORY_LIMIT=-1 composer require PACKAGE/NAME

该临时设置的作曲家内存限制 env 变量为无限。

如果在更新内存限制后仍然面临问题,那么最好的办法就是运行:

composer update --lock

这将更新您的锁文件,这样,如果您更改了 poser.json 文件,编写器就可以从锁文件运行。

您现在可以最佳地运行:

composer update

或者

composer install

在 Windows 上使用 Laragon 软件时,下面这行代码帮助我在不出现内存错误的情况下需要一个新的软件包:

php -d memory_limit=-1 "C:\laragon\bin\composer\composer.phar" require <insert package author here>/<insert package name here>

如果在 Windows 上使用 XAMP,我建议您将 Composer 版本更新为最新版本。 卸载,下载最新 -https://getcomposer.org/download/和安装。

也可以尝试将 PHP 版本更新为最新版本。

试试这个

COMPOSER_MEMORY_LIMIT=-1 composer require [package name]

我成功了!

从这个链接下载64位 PHP 的 zip 版本: Https://windows.php.net/download/

enter image description here

现在将其解压缩为 C: PHP-74并将 Php.ini 开发重命名为 Php.ini

php.ini

现在打开这个 php.ini 并通过删除 ;(分号)取消注释以下内容。

extension_dir = "ext"
extension=bz2
extension=curl
extension=fileinfo
extension=gd2
extension=gettext
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
extension=openssl
extension=pdo_sqlite

在我的场景中,需要这些扩展,您可以比较旧的 php.ini 文件 xampp 或 wamp 解决这个问题。现在保存文件并运行以下命令。

"C:\PHP-74\php.exe" -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" update

如果遇到作曲器内存问题,现在最好的选择可能是使用作曲器 v2,如果可以的话。

Composer v2有许多性能改进,因此,它占用的内存要少得多。

我总是不得不使用 COMPOSER_MEMORY_LIMIT=-1 composer update,但在 v2更新后,我不再需要使用这个。

查看发布公告 https://blog.packagist.com/composer-2-0-is-now-available/或下载最新版本 https://getcomposer.org/download/

将作曲家更新到 v2。

composer self-update --2

删除 供应商路径和 作曲家,锁定文件。

设定在 Php.ini memory_limit=-1

快跑

composer install

这个对我有帮助,显示了内存使用情况:

php -d memory_limit=-1 /usr/local/bin/composer update --verbose --profile