本文概述

一个非常简单的事实解释了在PHP中执行脚本期间基于VirtualAlloc和VirtualFree方法的错误, PHP没有足够的可用内存来执行它, 这就是抛出异常的原因, 你也会发现PHP致命错误消息”内存不足(已分配xxxxxx)(试图分配xxxx字节)”。例如, 最近使用最新版本的Composer尝试使用composer update指令更新软件包时, 会引发这种异常:

Loading composer repositories with package information

Updating 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 220

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 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:\Windows

Loaded Configuration File: C:\xampp72\php\php.ini

Scan 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-limit

memory_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-limit

memory_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:

将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 PHP

extension=gd2

extension=openssl

现在你已经具有此64位PHP版本的基本配置, 现在可以尝试使用以下二进制文件运行composer命令:

"C:\Users\sdkca\Desktop\php72\php.exe" -d memory_limit=-1 "C:/ProgramData/ComposerSetup/bin/composer.phar" update

编码愉快!

php 猴子补丁,如何解决Composer安装/更新错误:VirtualAlloc()失败:[0x00000008]相关推荐

  1. Win10 更新补丁后出现“未安装音频设备” 错误 2021-10-14

    Win10 更新补丁后出现"未安装音频设备" 错误修复方法 日前更新win10补丁后,右下角音频图标出现红色叉叉,提示"未安装音频设备",卸载驱动等方式均无效, ...

  2. macos安装更新错误_如何控制何时安装macOS更新

    macos安装更新错误 Updates are necessary, but annoying. Which is why your Mac, by default, installs them au ...

  3. 解决Win7安装更新补丁提示0x80240037

    Win7安装更新补丁提示0x80240037该怎么办?最近使用Win7系统的用户反应在安装系统补丁的时候出现了0x80240037的错误提示,是怎么回事呢?出现这样的现象一般是由于安装不兼容引起的,针 ...

  4. Windows 7 更新补丁(解决无法安装Axure RP 9)亲测可用

    出现如上问题 我们可以通过微软发布的更新补丁,解决这个问题. 安装: 一.安装windows7补丁(windows10系统跳过该步骤) 根据自己系统位数选择安装.计算机 右击[属性] Windows7 ...

  5. composer 更新php位置,使用composer安装/更新PHP包

    composer是PHP用来管理PHP依赖关系的工具. 安装composer 1 2curl -s https://getcomposer.org/installer | php sudo mv co ...

  6. ubuntu解决软件安装依赖错误

    ubuntu解决软件安装依赖问题 无法用apt-get install package_name 安装软件啦,总是出现依赖错误,导致不安装软件.连基本的aptitude debian包管理软件也不能用 ...

  7. c log 指定服务器,解决 SQL2000安装程序配置服务器失败。参考服务器错误日志和C:\WINDOWS\sqlstp.log方法...

    重新安装SQL Server 2000时错误,提示"参考服务器错误日志和 C:/WINDOWS/sqlstp.log了解更多信息 重装sql经常遇到2个问题 安装好SQL Server 20 ...

  8. 一键脚本解决Windows系统更新错误(0x80070003)

    新建文本,写入以下内容并保存为bat文件 REM 解决系统更新错误(0x80070003) pause net stop "Windows Update" rd /s/q &quo ...

  9. 通过WinPE卸载补丁,解决因安装补丁电脑蓝屏、无法开机等问题

    安装windows安全补丁后,开机修复不成功,或者蓝屏,可以尝试以下解决方案 使用PE里面的dism工具卸载近期安装的补丁 WinPE进入系统以后 进入PE后,点击"开始" > ...

最新文章

  1. 图灵奖得主杨立昆:AI+时代,未来将会如何被改变
  2. git/github的使用
  3. 【论文知识点笔记】GNN概述(图神经网络概述)
  4. 2020年度盘点出炉!技术好文一口气读完
  5. 广告出价--如何使用PID控制广告投放成本
  6. SAP CRM里Interaction Object是个什么东东
  7. 《JavaScript高级程序设计》笔记总结
  8. java date 判断是否是今天_java——推断日期是否在今天之前
  9. php 删除数组的空元素,php删除数组空元素的方法_后端开发
  10. python 多条件 选择 算法_浅析Python中的多条件排序实现
  11. FILESTREAM data cannot be placed on an empty filegroup 解决办法
  12. 2023年厦门大学全日制会计专硕(MPAcc)考研上岸前辈备考经验
  13. 智能手机linux系统下载软件,智能手机下载工具
  14. 阿铭Linux_传统IDC 部署网站学习笔记20190122
  15. 样本峰度(kurtosis)与随机变量的峰度及四阶统计量之间的关系和计算估计
  16. 这37个自学网站,一年让你省下十几万。钱买辆车他不香嘛
  17. Python入门到放弃
  18. 计算机怎么打字快,电脑新手如何快速打字?
  19. 如何下载网页上的视频?
  20. 【QT】linux下alsa库的移植和QT中音视频的处理笔记

热门文章

  1. 有些政府性质的网站对非IE浏览器不怎么支持,该如何处理?
  2. windows安装JDK出现error:could not open ‘...jvm.cfg‘
  3. 全连接神经网络的两大缺陷
  4. 【linux】linux 新建用户、用户组 以及为新用户分配权限
  5. 开放式激光振镜运动控制器(四):ZMC408SCAN振镜控制光纤激光器加工
  6. java获取xml子节点_java如何获取XML中子节点的内容
  7. 离散数学学习笔记——第一讲——集合论基础(1.5可数集合与不可数集合)
  8. 人工神经网络(ANN)相关介绍
  9. 数电和Verilog-时序逻辑实例四:状态机(三段式描述)
  10. 云原生系列1 pod基础