Limite de memória de atualização do compositor


96

Preciso executar a atualização do composer na minha hospedagem, então faço login com ssh e tento executar o comando:

composer update

dentro da pasta / www onde tenho a instalação do Laravel e do composer

mas recebo o erro:

insira a descrição da imagem aqui

em contato com meu provedor de hospedagem, eles me dizem para executar o comando:

php -d memory_limit=512M composer update

Eu executo este comando, mas recebo: "Não foi possível abrir o arquivo: composer"

O que fazer? Qual é a solução aqui?


2
Como disse @Sven, em produção composer installbasta. No seu caso, ao usar uma hospedagem compartilhada, acho que você não vai conseguir composer updatetrabalhar, então a única maneira é comprar uma hospedagem VPS como Digital Ocean, Linode.
Lucas Silva

Respostas:


143

Quando você o executa composer update, o sistema operacional examina os caminhos configurados e tenta localizar um arquivo executável com esse nome.

Quando em execução php composer update, a composerstring é tratada como um parâmetro para o PHP, que não é pesquisado em nenhum caminho. Você deve fornecer o caminho completo para executá-lo.

A execução which composerdirá onde o sistema operacional encontra o executável do composer e, em seguida, basta usar o caminho completo no comando PHP:

$>which composer
/usr/local/bin/composer

$>php -d memory_limit=512M /usr/local/bin/composer update
...

Observe que 512 MB pode ser muito pouco. Minha percepção é que felizmente levará 1 GB ou mais, dependendo do número de dependências que você usa e da variedade de versões que você permite teoricamente, ou seja, se você permitir o Symfony ~2.3, então você fará o Composer lidar com muito mais versões possíveis em comparação com o uso ~2.7.

Observe também que executar o Composer na máquina de produção não é a melhor ideia. Você teria que ter acesso ao Github, talvez fornecer credenciais de acesso, ter ferramentas VCS instaladas, e você facilmente quebrará seu site se algum dos servidores de hospedagem remota estiver offline durante a atualização. É uma ideia melhor usar o Composer em um sistema de implantação que faz toda a preparação e, em seguida, move todos os arquivos para o servidor de produção.

Atualizar

É o ano de 2020 agora, e a maneira como o Composer gerencia sua memória mudou um pouco. O mais importante é que o Composer aumentará o limite de memória sozinho se encontrar um limite muito baixo. No entanto, isso desencadeia imediatamente o problema de ficar sem memória em máquinas com muito pouca memória instalada. Você pode fazer o Composer usar menos memória configurando a variável de ambiente como COMPOSER_MEMORY_LIMIT=512M, mas isso criará problemas se o Composer precisar de mais memória para operar corretamente.

Meu ponto principal permanece verdadeiro: não execute o Composer em máquinas que tenham pouca memória instalada. Você precisa potencialmente de 1,5 GB de memória livre para atualizar tudo.


Acabei de escrever: php -r "readfile (' getcomposer.org/installer' );" | php e depois disso tudo funciona bem ... OBRIGADO PELA AJUDA
Andrew

41
php -d memory_limit=-1 $(which composer) updateé mais conveniente porque não há necessidade de especificar o caminho do compositor.
Rax

1
Isso é ótimo. Eu não sabia que você poderia aumentar a memória para um único comando. Isso é o que isso está fazendo certo?
plushyObject

como no windows?
Ray

1
@Rax mais uma coisa, se você estiver executando este comando no Windows no mingw, você obterá um erro que o caminho deve ser traduzido, então use este comandophp -d memory_limit=-1 $(which composer).phar update
Faizan

155

Configure-o para usar a quantidade de memória que desejar com:

COMPOSER_MEMORY_LIMIT=-1 composer update

Como podemos definir esse valor ou qualquer valor globalmente? em vez de ter que fazer isso todas as vezes via CLI?
snh_nl de

@snh_nl você precisará definir o limite de memória php. Exemplo: capítulothree.com
blog

2
Defina-o globalmente em seu / etc / profile (ou qualquer shell que você usar) com COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMIT. Ou defini-lo como um alias de shell? alias memcomposer='COMPOSER_MEMORY_LIMIT=-1 composer'e, em seguida, use em memcomposervez decomposer
diamondsea

Ainda dizFatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 4096 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52
Ozan Kurt,

15

Estou enfrentando problemas com o composer porque ele consome toda a memória disponível e, em seguida, o processo é encerrado (na verdade, a mensagem de saída é "Killed")

Então, eu estava procurando uma solução para limitar o uso de memória do compositor.

Eu tentei (das respostas @Sven)

$ php -d memory_limit=512M /usr/local/bin/composer update

Mas não funcionou porque

"O Composer aumenta internamente o memory_limit para 1.5G."

-> Isso é do site oficial do compositor.

Então eu encontrei um comando que funciona:

$ COMPOSER_MEMORY_LIMIT=512M php composer.phar update

Porém, no meu caso 512mb não é suficiente!

Fonte: https://www.agileana.com/blog/composer-memory-limit-trou troubleshooting/


1
Tive que usar o composer assim: COMPOSER_MEMORY_LIMIT = 1024M composer require 'module'
jasonflaherty 01 de

1
Semelhante, useiCOMPOSER_MEMORY_LIMIT=-1 composer require <package name>
realtebo

13

Tive que combinar COMPOSER_MEMORY_LIMITe memory_limitna linha de comando:

No Windows:

set COMPOSER_MEMORY_LIMIT=99999999999&& php -d memory_limit=-1 composer.phar update

No Linux:

export COMPOSER_MEMORY_LIMIT=99999999999 && php -d memory_limit=-1 composer.phar update

Este é o único que funcionou para mim no Mac OS X El Capitan.
ymd_

12

A melhor solução para mim é

COMPOSER_MEMORY_LIMIT=-1 composer require <package-name>

mencionado por @realtebo


8

Se houver memória suficiente, o compositor irá consumi-la internamente e funcionar sem nenhum problema. Não há necessidade de dizer especificamente ao compositor para fazer isso.

Você tentou aumentar sua memória swap, porque funcionou para mim. Aumentei a memória swap para 4096Mb (4GB) e agora tudo parece ótimo para mim.

primeiro use " sudo free" para ver a memória disponível e a memória de troca. e configurar a troca como,

Para Debian:

sudo fallocate -l 4G /swapfile
sudo dd if=/dev/zero of=/swapfile bs=4096k count=1048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

para torná-lo permanente, adicione-o ao arquivo / etc / fstab, /swapfile swap swap defaults 0 0

Para CentOS:

[root@myserver]:/# cd /var
[root@myserver]:/var# touch swap.img
[root@myserver]:/var# chmod 600 swap.img
[root@myserver]:/var# mkswap /var/swap.img

[root@myserver]:/var# dd if=/dev/zero of=/var/swap.img bs=4096k count=1000
[root@myserver]:/var# mkswap /var/swap.img 
[root@myserver]:/var# swapon /var/swap.img

você pode aumentar sua memória swap alterando bs = 1024k ou 2048k ou 8096k dependendo do tamanho do seu volume físico. use os comandos 'swapon' e swapoff para ver a diferença.

marque 'troca' (60 deve ser bom,)

cat /proc/sys/vm/swappiness

5

Você pode alterar o memory_limitvalor em seu php.ini

Tente aumentar o limite em seu arquivo php.ini

Use -1 para ilimitado ou defina um valor explícito como 2G

memory_limit = -1

Nota: O Composer aumenta internamente o memory_limit para 1,5G.

Leia a documentação getcomposer.org


3

No MAC OS High Siera, executei o seguinte:

MacBook-Pro:asiu jack$ php --ini

Devolvida:

Configuration File (php.ini) Path: /usr/local/etc/php/7.4
Loaded Configuration File:         /usr/local/etc/php/7.4/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.4/conf.d
Additional .ini files parsed:      /usr/local/etc/php/7.4/conf.d/ext- 
opcache.ini,
/usr/local/etc/php/7.4/conf.d/php-memory-limits.ini

Todas as respostas acima estão definindo a configuração carregada que é atualizada, mas observe que os arquivos .ini adicionais analisados ​​possuem php-memory-limits.ini como um arquivo separado. Você também deve atualizar este limite de memória de arquivo. da mesma forma, abra no editor de texto e mude para algo como 2G. A saída em caso de falha de limite de memória deve informar quanta memória ele precisa para ser executado, apenas defina-o para um valor superior ou -1 para ilimitado.


2

Este erro pode ocorrer especialmente quando você está atualizando grandes bibliotecas ou bibliotecas com muitas dependências. O Composer pode precisar de muita memória.

Certifique-se de que seu próprio compositor esteja atualizado para a versão mais recente:

php composer.phar --self-update

Você pode aumentar o limite de memória do compositor temporariamente adicionando a variável de ambiente de limite de memória do compositor:

COMPOSER_MEMORY_LIMIT=128MB php composer.phar update

Use o formato “128M” para megabyte ou “2G” para gigabyte. Você pode usar o valor “-1” para ignorar o limite de memória completamente.

Outra forma seria aumentar o limite de memória do PHP:

php -d memory_limit=512M composer.phar update ...

2

Fiz isso no Windows 10 e trabalhei comigo:

php -d memory_limit=-1 C:/ProgramData/ComposerSetup/bin/composer.phar update

Você pode alterar o valor xx que deseja

 memory_limit=XX

1

Qual é o tamanho do seu servidor aws? Se ele tiver apenas 1 gb de ram, definir o limite de memória de 2 gb no php.ini não ajudará.

Se você não pode / não deseja aumentar o lado do servidor para obter mais RAM disponível, você também pode ativar o SWAP.

Veja aqui como habilitar a troca. Ele habilita 4 GB, embora eu normalmente faça apenas 1 GB.

Fonte: obtido do site laracast


0

No meu caso, nenhuma das respostas ajudou. Por fim, descobriu-se que mudar para uma versão de 64 bits do PHP (M $ Windows) corrigiu o problema imediatamente. Eu não alterei nenhuma configuração - simplesmente funcionou.


0

Estou executando o Laravel 6 com Homestead e também encontrei esse problema. Como sugerido aqui nas outras respostas, você pode prefixar COMPOSER_MEMORY_LIMIT=-1um único comando e executar o comando normalmente. Se você gostaria de atualizar sua configuração de PHP para sempre permitir memória ilimitada, siga estas etapas.

vagrant up
vagrant ssh
php --version # 7.4
php --ini # Shows path to the php.ini file that's loaded
cd /etc/php/7.4/cli # your PHP version. Each PHP version has a folder
sudo vi php.ini

Adicione memory_limit=-1ao seu arquivo php.ini. Se você está tendo problemas para usar o Vim ou fazer edições no arquivo php.ini, verifique esta resposta sobre como editar o arquivo php.ini com o Vim. O arquivo deve ser semelhante a este:

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

Observe que isso pode consumir uma quantidade infinita de memória em sua máquina. Provavelmente não é uma boa ideia para produção lol. Com o Laravel Valet teve que seguir este artigo e atualizar o valor da memória aqui:

sudo vi /usr/local/etc/php/7.4/conf.d/php-memory-limits.ini

Em seguida, reinicie o servidor com o Valet:

valet restart

Esta resposta também foi útil para alterar a configuração com o Laravel Valet no Mac para que as alterações tenham efeito.


0
<C:\>set COMPOSER_MEMORY_LIMIT=-1
<C:\>composer install exhausted/packages

3
Adicione alguma explicação à sua resposta de forma que outras pessoas possam aprender com ela
Nico Haase



0

Para Laravel

Etapa 1. Abra seu terminal

etapa 2. cdem seu diretório laravel

Etapa 3. Digite o comando which composer, em seu diretório laravel e observe o diretório no qual o composer reside.

etapa 4. execute o comando php -d memory_limit=-1 /opt/cpanel/bin/composer update(você também pode executar o código se funcionar para você)

(mude /opt/cpanel/bin/composerpara o caminho do diretório retornado na etapa 3)

Problema resolvido


0

No Windows 10 (Git bash), tive que usar este

php -d memory_limit=-1 C:\\composer\\composer.phar install

-1

No meu caso, precisava de permissões mais altas junto com esse aumento de limite de memória.

sudo COMPOSER_MEMORY_LIMIT=2G php /opt/bitnami/php/bin/composer.phar update

Executar o Composer com sudonão é uma boa ideia, pois irá confundir suas permissões. Parece que você está executando composer updateem um servidor - essa também é uma prática ruim, pois tornará muito mais diferente colocar as dependências calculadas sob controle de versão
Nico Haase

Concordo com @NicoHaase, você precisa ter muito cuidado ao usar isso! obrigado.
Naser Nikzad,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.