Я попытался установить aws/aws-sdk-php
вчера на одном из моих проектов Laravel 4, используя Composer, я не могу точно запомнить цепочку событий, но он не был успешно установлен. С тех пор я получаю ошибки, из-за которых у Composer закончилась Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 32 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52
.
Я увеличил php.ini memory_limit
до -1, и это все еще происходит, как в моей среде разработки, так и в производственной среде (производство Cent OS 6). Установка завершается успешно, если я увеличиваю memory_limit
через CLI при запуске composer_update
но это займет целую вечность.
Есть ли какой-то кеш, который мне нужно очистить, чтобы у Composer не хватало памяти? У меня такое ощущение, что он все равно пытается установить AWS SDK каждый раз, когда я запускаю обновление для композитора.
Файл композитора
{ "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "require": { "laravel/framework": "4.0.*", "rtablada/package-installer": "dev-master", "mogreet/mogreet-php": "dev-master", "twilio/laratwilio": "dev-master", "balloon/elephant.io": "dev-master", "facebook/php-sdk": "dev-master", "way/generators": "dev-master", "codesleeve/asset-pipeline": "dev-master", "natxet/CssMin": "dev-master" }, "autoload": { "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/database/seeds", "app/tests/TestCase.php", "app/libraries" ] }, "scripts": { "post-install-cmd": [ "php artisan optimize" ], "pre-update-cmd": [ "php artisan clear-compiled" ], "post-update-cmd": [ "php artisan optimize" ], "post-create-project-cmd": [ "php artisan key:generate" ] }, "config": { "preferred-install": "dist" }, "minimum-stability": "dev" }
EDIT: Прежде чем продолжить, убедитесь, что вы используете последнюю версию композитора, вы можете обновить его с помощью composer self-update
Когда вы запустите composer update
он рассчитает самую последнюю версию gitref для каждой из ваших библиотек (или последнюю версию), а затем установит эту версию библиотеки. Затем он сохранит эти версии в файле composer.lock
.
Когда вы запускаете composer install
, он просто устанавливает версии, определенные в файле composer.lock
.
Причина, по которой composer update
так долго и использует так много памяти, состоит в том, что он должен отслеживать версию каждой библиотеки, сравнивать ее с версией, определенной вами в вашем composer.json
а затем проверять все зависимости этой библиотеки. Это довольно интенсивный процесс.
Я нахожу, что работающий композитор с использованием hhvm
(вы можете установить его здесь ) ускоряет процесс composer update
массовом порядке.
Короче говоря, вам просто нужно жить с использованием высокой памяти и увеличить ее в файле php.ini
. Убедитесь, что вы обновили тот, который имеет отношение к вашей CLI.
EDIT: вы никогда не должны запускать composer update
в рабочей среде. Вы должны обновлять свои зависимости только при разработке, а затем использовать composer install
для установки вашего последнего использованного набора зависимостей композитора, когда вы находитесь в производственной среде.
В настоящий момент на Composer появляется ошибка, из-за которой память будет исчерпана.
Если вы это сделаете
composer install
Затем удалите папку внутри поставщика
rm -rf vendor/laravel
и делай
composer update
Вы получите эту ошибку. Это ошибка, она не должна исчерпать память.
Пока вы можете исправить это для себя, выполнив:
php -d memory_limit=-1 /usr/local/bin/composer update
Кроме того, проверьте этот поток , они собираются исправить это.
попробуй это. Это исправило мою проблему. Я думаю, что лучше исправить это, а не обновлять память.
sudo composer self-update
Просто введите следующие команды:
rm -rf vendor/
rm -rf composer.lock
php composer install --prefer-dist
Должна работать на устройствах с низкой памятью или других проблемах с памятью
Причина, по которой он занимал столько памяти, объясняется поведением Composer при обработке пакетов и ключевого слова replace.
Идея замены заключалась в том, что это позволило вам сделать две вещи:
Замените стандартную версию библиотеки своей собственной версией. например, если вы найдете пример в «symfony / yaml», вы можете его разветвить, исправить ошибку и затем отпустить ее в виде пакета «nightmicu / yaml». Затем вы можете сказать композитору, что «nightmicu / yaml» заменяет «symfony / yaml». Тогда любой другой пакет, который вы устанавливаете, который зависит от «symfony / yaml», будет удовлетворен наличием «nightmicu / yaml».
Это позволяет людям выпускать пакеты как отдельные компоненты, так и полную библиотеку, например, пакет фреймворка symfony заменяет каждый из своих пакетов компонентов.
Проблема в том, что ключевое слово replace, примерно до 1 часа назад, работало глобально по всему Packagist.
Это означает, что для популярных библиотек, которые были разветвлены и переименованы, существует огромное количество возможных версий для установки. Это то, что вызывало огромный объем использования памяти, и требует много времени для обработки.
Если вы получите последнюю версию composer.phar, теперь это будет лучше, так как «replace» теперь работает по-другому, только работая над пакетами, названными в корневом компоновщике. Json, то есть вы должны явно использовать пакет в своем composer.json чтобы он был заменен или действовал как замена, хотя я сам не смог его проверить.
Самый простой способ исправить это в Windows:
Перейти к: C: \ ProgramData \ ComposerSetup \ bin
Изменить композитор.bat
Измените его на:
@ECHO OFF php -d memory_limit=-1 "%~dp0composer.phar" %*
Сохраните файл и запустите:
композитор самопомощи