如何解决Composer安装/更新错误(VirtualAlloc()失败:[0x00000008])

本文概述

  • A.解决方案:增加PHP最大内存限制
  • B.快速的猴子补丁解决方案
  • C.下载基于x64的PHP版本
一个非常简单的事实解释了在PHP中执行脚本期间基于VirtualAlloc和VirtualFree方法的错误, PHP没有足够的可用内存来执行它, 这就是抛出异常的原因, 你也会发现PHP致命错误消息” 内存不足(已分配xxxxxx)(试图分配xxxx字节)” 。例如, 最近使用最新版本的Composer尝试使用composer update指令更新软件包时, 会引发这种异常:
Loading composer repositories with package informationUpdating dependencies (including require-dev)VirtualAlloc() failed: [0x00000008] Not enough memory resources are available to process this command.VirtualFree() failed: [0x000001e7] Attempt to access invalid address.VirtualAlloc() failed: [0x00000008] Not enough memory resources are available to process this command.VirtualFree() failed: [0x000001e7] Attempt to access invalid address.PHP Fatal error:Out of memory (allocated 1512046592) (tried to allocate 4096 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/Solver.php on line 220Fatal error: Out of memory (allocated 1512046592) (tried to allocate 4096 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/Solver.php on line 220

有了先前的确认, 你可能正在考虑, 如果我的设备上的RAM超过8GB, 怎么办?好吧, 不幸的是, 问题并不总是相同的, 因此根据你的情况, 解决方案可能会明显不同。
A.解决方案:增加PHP最大内存限制 你需要知道的第一件事是PHP发行版的当前内存限制。你可以通过运行以下命令的CLI快速了解这一点:
php -r "echo ini_get('memory_limit'); "

在我们的情况下, 在不修改我们发行版的php.ini文件的情况下, 此命令在控制台中输出128M。当前这是某些PHP脚本可以运行的限制, 而作曲家基本上就是错误, 因此你将需要在提到的PHP配置文件(php.ini)中增加此限制。你可以通过以下命令知道哪个ini文件用于PHP的CLI版本:
php --ini

在Windows中, 这将输出:
Configuration File (php.ini) Path: C:\WindowsLoaded Configuration File:C:\xampp72\php\php.iniScan for additional .ini files in: (none)Additional .ini files parsed:(none)

因此, 使用你喜欢的文本编辑器打开php.ini文件, 并使用相当大的值(例如512M或1G)修改memory_limit属性的数量:
; Maximum amount of memory a script may consume (128MB); http://php.net/memory-limitmemory_limit=512M

当然, 数量会根据脚本的性能而变化, 因此你可能需要对其进行测试并根据需要进行更改。保存文件, 重新启动apache并再次测试脚本(如果使用的是composer, 请运行命令直至其生效)。如果它不起作用, 并且你遇到相同的异常, 请进一步增加该值, 直到它起作用为止(除非你安装了32位PHP, 该PHP的数量独立于其可用性, 其最大值为2G)。
如果你的值不起作用并且你使用的是64位PHP发行版, 请检查Monkeypatch解决方案, 该解决方案为PHP脚本定义了对RAM的无限使用(在生产环境中绝对不建议这样做, 但在开发环境中有助于了解问题所在)。
对Windows XAMPP用户或32位PHP发行版的重要警告
不幸的是, 如果在使用XAMPP时在运行某些脚本或作曲家时遇到此异常, 并且2056M的最大内存不足, 并且你仍然看到这些异常, 那么让我告诉你, 你遇到的问题很大将需要优化你的脚本, 或者在可能的情况下, 将其从32位分发转移到64位分发。
此问题基于以下事实:32位加味的发行版(例如众所周知的XAMPP环境仅提供32位体系结构)将不允许你使用更大量的内存, 即使你有16GB的可用RAM, 例如在你的电脑。 32位体系结构将在php.ini中将其限制为更大的值, 使其最大数量为1996MB-2056MB。
xampp用户的最后一个资源提示 如果你正在使用XAMPP的PHP发行版来使用composer, 并且你使用的指令(例如composer更新或composer安装)失败, 则意味着用于处理项目的composer.json的代码需要2GB以上的内存才能执行这将在xampp中失败。在这种情况下, 可怜的解决方案是像Wampp那样更改堆栈。此开发人员堆栈提供了64位版本, 在增加内存限制后不应遇到此问题。
B.快速的猴子补丁解决方案 如果你尝试使用具有不同值的异常尝试上述解决方案, 但这还不够, 则可以尝试为内存限制设置无限值:
警告 你不应该在生产中执行此操作, 因为PHP将具有无限的内存访问权限, 这意味着如果脚本泄漏内存, 则服务器可能无法使用, 直到重新启动为止。仅在开发环境中本地执行此操作, 以测试脚本是否正常工作。
; Maximum amount of memory a script may consume (128MB); http://php.net/memory-limitmemory_limit=-1

如果看到此异常时正在使用composer, 则可能要与PHP一起运行指令(composer更新), 并定位composer.phar文件, 例如:
php -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" update

C.下载基于x64的PHP版本 如果没有任何上述解决方案有效, 那么你将需要使用64位的PHP发行版来使用composer更新项目的依赖项。不用担心, 基本上你仍然可以在项目中使用当前的PHP版本, 但是你将在CLI中使用另一个版本来安装/更新依赖项。
访问Windows的PHP:二进制文件和源发布网站, 并下载所需的基于X64的PHP版本。在我们的例子中, 我们将使用64位的PHP 7.2:
如何解决Composer安装/更新错误(VirtualAlloc()失败:[0x00000008])

文章图片
将zip内容解压缩到系统的某个目录中。在本例中, 我们将其存储在桌面中:C:\ Users \ sdkca \ Desktop \ php72。在目录中, 你会找到64位PHP的二进制发行版, 但是尚未配置, 如果尝试使用此PHP二进制文件运行composer, 它可能会失败。首先, 复制你将在根目录中找到的php.ini-development文件, 并将副本名称更改为php.ini, 因此二进制文件会将此文件作为默认配置。
在新的php.ini文件(C:\ Users \ sdkca \ Desktop \ php72 \ php.ini)上, 你将需要取消注释extension_dir指令并启用gd2和openssl模块, 否则composer在执行命令期间会引发错误。 :
; Directory in which the loadable extensions (modules) reside.; http://php.net/extension-dir; extension_dir = "./"; On windows:extension_dir = "ext"; Uncomment as well the gd2 and openssl extensions to enable them in PHPextension=gd2extension=openssl

现在你已经具有此64位PHP版本的基本配置, 现在可以尝试使用以下二进制文件运行composer命令:
"C:\Users\sdkca\Desktop\php72\php.exe" -d memory_limit=-1 "C:/ProgramData/ComposerSetup/bin/composer.phar" update

【如何解决Composer安装/更新错误(VirtualAlloc()失败:[0x00000008])】编码愉快!

    推荐阅读