php 猴子补丁,如何解决Composer安装/更新错误:VirtualAlloc()失败:[0x00000008]
本文概述
一個非常簡單的事實解釋了在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]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超声波模块应用
- 下一篇: php编辑器编程程序,有哪些编辑器是可以