在我的 VM 上运行 composer.phar update
时出现此错误:
PHP 致命错误:第 179 行 phar:///bin/composer.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.*"
}
}
虚拟机最近刚从坏磁盘扇区问题中恢复,运行虚拟机的人说虚拟机已移动到新磁盘。我的虚拟机中只有 Java、PHP、httpd、postgre、rabbitmq 和网站本身,并且在发生这种情况之前它已经完美运行了大约 4 个月。我正在使用 PHP 5.6.11。有人可以帮忙吗?
memory_limit
存在,因为如果我计算正确的话 144115188075867549 正好是 128 PB...
vendor
目录并再次运行该命令?
检查 Composer's troubleshooting wiki,尤其是内存限制错误部分。
例如,通过像这样运行作曲家:
php -d memory_limit=-1 `which composer` update
我再也没有错误了。因此,这可能是内存不足的问题,可以内联解决,而无需更改您的默认 PHP 配置。
上面的命令所做的是将 PHP CLI 内存限制设置为“无限制”(即 -1),然后运行内联 composer update
命令。
请注意,您可能应该使用 composer.phar
PHP 脚本的真实路径,而不是 `which composer`。内联写入的 which composer
(如我上面的示例)将内联解析到您的 composer.phar
完整路径(您可以使用任何您喜欢的形式)。
注意:如果超出物理内存和虚拟内存,上述解决方案也可能会失败。如果是这种情况,那么显而易见的解决方案是增加系统的虚拟内存,然后再试一次。
解决我的问题的唯一方法是这样做:
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
根据我的经验,composer 的内存错误通常意味着它花费了太多的内存来寻找要安装的正确的包组合,尤其是版本限制不够具体。例如,^5.2.4 匹配 5.3 到 5.3.29、5.4 到 5.4.45 等。对于每个特定的版本和排列,composer 必须获取包的依赖项以检查是否满足所有约束。这通常是内存消耗变得巨大的时候。
一旦确定了版本,安装阶段使用的内存就会少得多。每个包的解析版本也存储在 composer.lock 文件中,以便可以在其他环境中复制安装的特定排列。这是您问题的潜在解决方案:在您的开发机器(应该有足够的内存)中运行 composer update,部署更新的 composer.lock,然后在服务器上运行 composer install。
Composer install 将始终引用现有的 composer.lock 来为每个包安装的版本,因此应该很少遇到内存问题。
有关如何在 composer.json 中表达版本约束的参考,请查看 https://getcomposer.org/doc/articles/versions.md
"aws/aws-sdk-php": "~3.2"
,它正在解析为 3.204.0
。所以我将此约束更新为 "aws/aws-sdk-php": "~3.204"
并且内存问题消失了。因此,我还审查了其他软件包的约束,以避免将来出现此类问题。我建议在使用 memory_limit
之前先尝试一下,因为它真的可以让您在基于云的设置中受益。
我没有将您的内存限制永久设置为增加的数量(或无限),而是使用它;
# Running an update
COMPOSER_MEMORY_LIMIT=-1 composer update
COMPOSER_MEMORY_LIMIT=-1 composer require PACKAGE/NAME
暂时将作曲家内存限制环境变量设置为无限制。
通过删除整个供应商文件夹,然后再次进行作曲家更新来解决,它可以工作......不知何故。我什至不明白:v
composer.lock
文件,我想您可以提交票证。
composer install
对我来说在 Windows 上工作。我猜更新比较比全新安装占用更多内存。
Katiak 的答案有效,但我不得不修改它。您需要 4 GB 的可用空间才能在 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
内存限制错误
Composer 有时可能会在某些命令上失败并显示以下消息:
PHP 致命错误:允许的 XXXXXX 字节的内存大小已用完 <...> 或者在我的情况下:致命错误:phar://C:/ProgramData/ComposerSetup/ 中的内存不足(已分配 1116733440)(试图分配 134217728 字节) bin/composer.phar/src/Composer/DependencyResolver/Pool.php 在第 339 行
在这种情况下,应该增加 PHP memory_limit。
注意:Composer 在内部将 memory_limit 增加到 1.5G。
要获取当前 memory_limit 值,请运行:
php -r "echo ini_get('memory_limit').PHP_EOL;"
尝试增加 php.ini 文件中的限制(例如,/etc/php5/cli/php.ini 用于类似 Debian 的系统):
; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1
Composer 还遵守由 COMPOSER_MEMORY_LIMIT 环境变量定义的内存限制:
COMPOSER_MEMORY_LIMIT=-1 composer.phar <...>
或者,您可以使用命令行参数增加限制:
php -d memory_limit=-1 composer.phar <...>
当 shell fork 炸弹保护被激活时,这个问题也可能发生在 cPanel 实例上。有关详细信息,请参阅 cPanel 网站上的分叉炸弹功能的 documentation。
要获取加载的 php.ini 文件位置,请尝试:
php --ini
来源:(作曲家 docs)
这是内存问题,不是存储问题。您已达到 PHP 内存限制。
编辑 /etc/php.ini 并增加内存限制( memory_limit = 128M 替换为 memory_limit = 256M )
我建议你寻找作曲家使用这么多内存的原因,并找到减少 PHP 内存使用的方法:
如果您尚未安装 Zend Opcache(在不同实例之间共享 PHP 内存),请升级到 PHP56 卸载任何和所有未使用的 PECL 扩展
这是您遇到的问题:https://github.com/composer/composer/issues/1898
试试这个
COMPOSER_MEMORY_LIMIT=-1 composer require [package name]
我在一台 Windows 机器上,我尝试了这个问题的所有答案,但没有一个有效。对我来说,在我使用 64 位版本的 PHP 运行 composer 之后,它终于起作用了。
要使用 PHP x64 的本地副本运行 composer,您可以执行以下操作:
从这里下载 zip 文件(我使用的是 VC15 x64 Thread Safe 版本): https://windows.php.net/download 解压文件 复制 php.ini-development 并重命名为 php.ini 取消注释 extension_dir = "ext"行和您需要的任何其他 php 扩展(例如 extension=gd2 或 extension=openssl)。如果更新需要任何其他 PHP 扩展,那么它会在运行命令时告诉您。
工作命令:
"C:\path\to\php-7.2.23-Win32-VC15-x64\php.exe" -d memory_limit=-1 "C:/path/to/composer.phar" update
在 Windows 上使用软件 Laragon 时,以下行帮助我需要一个新软件包而不会出现内存错误:
php -d memory_limit=-1 "C:\laragon\bin\composer\composer.phar" require <insert package author here>/<insert package name here>
既适用于本地环境,又适用于容器(例如,在管道的构建阶段)的解决方案,其中作曲家可能以棘手的方式安装,是
COMPOSER_MEMORY_LIMIT=-1 composer install
php -d memory_limit=-1 /usr/local/bin/composer install
这个命令对我有用。
就我而言,由于在 vagrant box 内运行 composer install
,我遇到了这个错误。在我的主机中运行它不会导致问题。
除了将 memory_limit = -1
放入 php.ini
文件之外,没有什么对我有用。
我在我的 php.ini 文件中设置了 memory_limit=-1 但没有工作,但我继续从下面的链接执行命令,然后运行 composer install 并完美运行
https://tecadmin.net/enable-swap-on-ubuntu/
它对我有用!
从以下链接下载您的 PHP 的 64 位 zip 版本:https://windows.php.net/download/
https://i.stack.imgur.com/72Kqg.png
现在将其解压缩到 C:\PHP-74\ 并将 php.ini-development 重命名为 php.ini
https://i.stack.imgur.com/Iruni.png
现在打开这个 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
在我的场景中,这些扩展是必需的,您可以比较旧的 xampp php.ini 文件或 wamp 解决这个问题。现在保存文件并运行以下命令。
"C:\PHP-74\php.exe" -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" update
将作曲家更新到 v2。
composer self-update --2
删除供应商路径和 composer.lock 文件。
在 php.ini memory_limit=-1
中设置。
跑
composer install
这个帮助了我,显示了内存使用情况:
php -d memory_limit=-1 /usr/local/bin/composer update --verbose --profile
您也可以通过删除供应商目录并重新执行 composer install 命令来解决。
尝试增加活动 php.ini 文件中的 memory_limit 值。
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 512M
例如。
此解决方案将解决您的问题。
更新您的 php.ini 文件,然后重新启动 Apache 或您的服务器示例:memory_limit=128M 到 memory_limit=1128M
这是我的工作。
php -d memory_limit=-1 /usr/local/bin/composer update --no-scripts
memory_limit=-1
用于此过程的无限内存,当您在 composer 之前添加 php 以获得无限内存时,您必须为 composer 提供其安装在服务器上的完整路径(对于 ubntu),其 /usr/local/bin/composer
Reaming 部分只是 Compoer 命令更新/安装
增加我的 php.ini
上的 memory_limit
值并没有解决我的问题。我所做的是:
删除 composer.lock,运行 composer update,
这就是诀窍!
如果您在更新内存限制后仍然遇到问题,那么最好尝试运行:
composer update --lock
这将更新您的锁定文件,以便如果您更改了 composer.json 文件,composer 可以从中运行。
您现在可以优化运行:
composer update
或者
composer install
如果在 Windows 上使用 XAMP,我建议将您的 Composer 版本更新到最新版本。卸载、下载最新版本 - https://getcomposer.org/download/ 并安装。
也可以尝试将 PHP 版本更新到最新版本。
如果您遇到作曲家内存问题,现在最好的选择可能是使用 composer v2,如果可以的话。
Composer v2 有许多性能改进,因此占用的内存要少得多。
我总是不得不使用 COMPOSER_MEMORY_LIMIT=-1 composer update
,但在 v2 更新之后,我不再需要使用它。
查看发布公告 https://blog.packagist.com/composer-2-0-is-now-available/ 或下载最新版本 https://getcomposer.org/download/
sudo php -d memory_limit=-1 bin/magento setup:di:compile
不定期副业成功案例分享
which composer update