Как устранить ошибку установки / обновления Composer: VirtualAlloc () не удалось: [0x00000008]

Ошибки, основанные на VirtualAlloc а также VirtualFree методы во время выполнения скрипта в PHP, объясняется очень простым фактом, PHP не хватает памяти для его выполнения, вот почему возникает исключение, и вы также увидите сообщение об ошибке PHP Fatal «Недостаточно памяти (выделено 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 

С предыдущим подтверждением вы можете подумать, как это возможно, если на моем устройстве установлено более 8 ГБ ОЗУ? Ну, к сожалению, проблема не всегда одна и та же, поэтому в зависимости от вашего случая решение может быть разным.

Решение: увеличить максимальный предел памяти PHP

Первое, что вам нужно знать, это текущий лимит памяти вашего дистрибутива PHP. Вы можете быстро узнать это из CLI, выполнив следующую команду:

php -r "echo ini_get('memory_limit');"

В нашем случае без изменения php.ini файл нашего дистрибутива, эта команда выводит 128M в консоли. В настоящее время это ограничение, доступное для запуска некоторого PHP-скрипта, с composer, который в основном является ошибкой, поэтому вам нужно будет увеличить это ограничение в упомянутом конфигурационном файле PHP (php.ini). Вы можете узнать, какой ini-файл используется для CLI-версии PHP, с помощью следующей команды:

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 файл с вашим любимым текстовым редактором и измените количество memory_limit атрибут со значительным значением, например 512M или 1G:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit=512M

Конечно, сумма будет меняться в зависимости от производительности вашего скрипта, поэтому вы можете протестировать его и изменить в соответствии со своими потребностями. Сохраните файл, перезапустите apache и снова протестируйте свои скрипты (если вы работаете с composer, запускайте команды, пока он не заработает). Если это не сработает, и вы столкнетесь с тем же исключением, увеличьте значение еще больше, пока оно не сработает (если у вас не установлена ​​32-битная установка PHP, где сумма, независимо от ее доступности, ее максимальное значение будет 2G).

Если ваши значения не работают и у вас есть 64-битный дистрибутив PHP, проверьте решение monkeypatch, которое определяет неограниченное использование оперативной памяти для PHP-скриптов (абсолютно не рекомендуется в производственной среде, но полезно в средах разработки, чтобы узнать, что не так).

Важное предупреждение для пользователей Windows XAMPP или 32-битных дистрибутивов PHP

К сожалению, если вы получаете это исключение при запуске какого-либо сценария или композитора при использовании XAMPP, а объем максимальной памяти в 2056M недостаточен, и вы по-прежнему видите исключения, позвольте мне сказать, что у вас большие проблемы, так как вы потребуется либо оптимизировать ваш сценарий, либо, если возможно, перейти от 32-разрядного к 64-разрядному.

Эта проблема основана на том факте, что 32-битные специализированные дистрибутивы (как широко известная среда XAMPP, которая предлагает только 32-битную архитектуру) не позволят вам использовать больший объем памяти, даже если у вас есть, например, 16 ГБ ОЗУ. на твоем компьютере. 32-битная архитектура будет ограничивать это большим значением в php.ini до его максимального объема 1996MB — 2056MB.

Последний совет по ресурсам для пользователей xampp

Если вы работаете с composer, используя PHP-дистрибутив XAMPP, и инструкция, которую вы используете, например, обновление composer или установка composer, не выполняется, это будет означать, что код для обработки composer.json вашего проекта требует более 2 ГБ памяти для выполнения, что не сработает в xampp. К сожалению, решение в этом случае состоит в том, чтобы изменить стека, как Wampp. Этот стек разработчика предлагает 64-битную версию, которая не должна сталкиваться с этой проблемой после увеличения лимита памяти.

Быстрое решение Monkeypatch

Если вы попробовали упомянутое решение для исключения с другими значениями, но этого было недостаточно, вы можете попробовать установить неограниченное значение для предела памяти:

Предупреждение

Вы не должны делать это в производственном процессе, так как PHP будет иметь неограниченный доступ к памяти, а это означает, что если ваши скрипты имеют утечку памяти, ваш сервер может стать непригодным для использования до его перезапуска. Делайте это только локально в вашей среде разработки, чтобы проверить, работают ваши сценарии или нет.

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit=-1

Если вы используете composer, когда видите это исключение, вы можете запустить инструкцию (composer update) вместе с PHP и нацеливание на composer.phar файл, например:

php -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" update
Ссылка на основную публикацию
Adblock
detector