php 猴子补丁,如何解决Composer安装/更新错误:VirtualAlloc()失败:[0x00000008]
本文概述
一個非常簡單的事實解釋了在PHP中執(zhí)行腳本期間基于VirtualAlloc和VirtualFree方法的錯誤, PHP沒有足夠的可用內(nèi)存來執(zhí)行它, 這就是拋出異常的原因, 你也會發(fā)現(xiàn)PHP致命錯誤消息”內(nèi)存不足(已分配xxxxxx)(試圖分配xxxx字節(jié))”。例如, 最近使用最新版本的Composer嘗試使用composer update指令更新軟件包時, 會引發(fā)這種異常:
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
有了先前的確認(rèn), 你可能正在考慮, 如果我的設(shè)備上的RAM超過8GB, 怎么辦?好吧, 不幸的是, 問題并不總是相同的, 因此根據(jù)你的情況, 解決方案可能會明顯不同。
A.解決方案:增加PHP最大內(nèi)存限制
你需要知道的第一件事是PHP發(fā)行版的當(dāng)前內(nèi)存限制。你可以通過運行以下命令的CLI快速了解這一點:
php -r "echo ini_get('memory_limit');"
在我們的情況下, 在不修改我們發(fā)行版的php.ini文件的情況下, 此命令在控制臺中輸出128M。當(dāng)前這是某些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文件, 并使用相當(dāng)大的值(例如512M或1G)修改memory_limit屬性的數(shù)量:
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit=512M
當(dāng)然, 數(shù)量會根據(jù)腳本的性能而變化, 因此你可能需要對其進(jìn)行測試并根據(jù)需要進(jìn)行更改。保存文件, 重新啟動apache并再次測試腳本(如果使用的是composer, 請運行命令直至其生效)。如果它不起作用, 并且你遇到相同的異常, 請進(jìn)一步增加該值, 直到它起作用為止(除非你安裝了32位PHP, 該PHP的數(shù)量獨立于其可用性, 其最大值為2G)。
如果你的值不起作用并且你使用的是64位PHP發(fā)行版, 請檢查Monkeypatch解決方案, 該解決方案為PHP腳本定義了對RAM的無限使用(在生產(chǎn)環(huán)境中絕對不建議這樣做, 但在開發(fā)環(huán)境中有助于了解問題所在)。
對Windows XAMPP用戶或32位PHP發(fā)行版的重要警告
不幸的是, 如果在使用XAMPP時在運行某些腳本或作曲家時遇到此異常, 并且2056M的最大內(nèi)存不足, 并且你仍然看到這些異常, 那么讓我告訴你, 你遇到的問題很大將需要優(yōu)化你的腳本, 或者在可能的情況下, 將其從32位分發(fā)轉(zhuǎn)移到64位分發(fā)。
此問題基于以下事實:32位加味的發(fā)行版(例如眾所周知的XAMPP環(huán)境僅提供32位體系結(jié)構(gòu))將不允許你使用更大量的內(nèi)存, 即使你有16GB的可用RAM, 例如在你的電腦。 32位體系結(jié)構(gòu)將在php.ini中將其限制為更大的值, 使其最大數(shù)量為1996MB-2056MB。
xampp用戶的最后一個資源提示
如果你正在使用XAMPP的PHP發(fā)行版來使用composer, 并且你使用的指令(例如composer更新或composer安裝)失敗, 則意味著用于處理項目的composer.json的代碼需要2GB以上的內(nèi)存才能執(zhí)行這將在xampp中失敗。在這種情況下, 可憐的解決方案是像Wampp那樣更改堆棧。此開發(fā)人員堆棧提供了64位版本, 在增加內(nèi)存限制后不應(yīng)遇到此問題。
B.快速的猴子補丁解決方案
如果你嘗試使用具有不同值的異常嘗試上述解決方案, 但這還不夠, 則可以嘗試為內(nèi)存限制設(shè)置無限值:
警告
你不應(yīng)該在生產(chǎn)中執(zhí)行此操作, 因為PHP將具有無限的內(nèi)存訪問權(quán)限, 這意味著如果腳本泄漏內(nèi)存, 則服務(wù)器可能無法使用, 直到重新啟動為止。僅在開發(fā)環(huán)境中本地執(zhí)行此操作, 以測試腳本是否正常工作。
; 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發(fā)行版來使用composer更新項目的依賴項。不用擔(dān)心, 基本上你仍然可以在項目中使用當(dāng)前的PHP版本, 但是你將在CLI中使用另一個版本來安裝/更新依賴項。
訪問Windows的PHP:二進(jìn)制文件和源發(fā)布網(wǎng)站, 并下載所需的基于X64的PHP版本。在我們的例子中, 我們將使用64位的PHP 7.2:
將zip內(nèi)容解壓縮到系統(tǒng)的某個目錄中。在本例中, 我們將其存儲在桌面中:C:\ Users \ sdkca \ Desktop \ php72。在目錄中, 你會找到64位PHP的二進(jìn)制發(fā)行版, 但是尚未配置, 如果嘗試使用此PHP二進(jìn)制文件運行composer, 它可能會失敗。首先, 復(fù)制你將在根目錄中找到的php.ini-development文件, 并將副本名稱更改為php.ini, 因此二進(jìn)制文件會將此文件作為默認(rèn)配置。
在新的php.ini文件(C:\ Users \ sdkca \ Desktop \ php72 \ php.ini)上, 你將需要取消注釋extension_dir指令并啟用gd2和openssl模塊, 否則composer在執(zhí)行命令期間會引發(fā)錯誤。 :
; 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
現(xiàn)在你已經(jīng)具有此64位PHP版本的基本配置, 現(xiàn)在可以嘗試使用以下二進(jìn)制文件運行composer命令:
"C:\Users\sdkca\Desktop\php72\php.exe" -d memory_limit=-1 "C:/ProgramData/ComposerSetup/bin/composer.phar" update
編碼愉快!
總結(jié)
以上是生活随笔為你收集整理的php 猴子补丁,如何解决Composer安装/更新错误:VirtualAlloc()失败:[0x00000008]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超声波模块应用
- 下一篇: python实现闹钟功能