Erro de atualização do PHP Composer “não é possível alocar memória” (usando o Laravel 4)

168

Eu simplesmente não consigo resolver este.

Estou no plano básico de Linode 1G RAM. Tentando instalar um pacote via Composer e não está me deixando. Meu limite de memória está definido como "-1" no PHP.ini

Há mais alguma coisa que eu possa fazer para instalar isso?

Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing thujohn/rss (dev-master df80a7d)
    Downloading: 100%         
PHP Fatal error:  Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:975
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 975, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(975): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(853): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(818): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(752): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php on line 975

Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:975
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 975, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(975): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(853): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(818): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(752): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php on line 975
ericbae
fonte

Respostas:

96

Um pouco velho, mas apenas no caso de alguém novo estar procurando uma solução, a atualização da sua versão do PHP pode corrigir o problema.

Além disso, você deve confirmar o arquivo composer.lock e instalar o compositor em um ambiente de produção que consome menos recursos.

Mais detalhes aqui: https://github.com/composer/composer/issues/1898#issuecomment-23453850

fl3x7
fonte
12
BRILHANTE! Isso funcionou. Não atualizei meu PHP, mas o envio e a atualização do arquivo composer.lock instalaram tudo corretamente. Obrigado.
Ericbae 5/10
6
Cheguei atrasado na festa, mas simplesmente desliguei o Apache e o MySQL. Há uma razão pela qual estou usando um VPS de 512 MB de RAM, não quero gastar dinheiro.
Kumar
11
Atualizar o PHP não é uma solução. Eu tenho 7.0.21 e ainda recebo esse erro.
Cj5
A solução da @ Kumar funcionou para mim. Super fácil e como a maioria das coisas, óbvio em retrospectiva :)
James Bridgewater
Muito obrigado. Me salvou um monte de tempo.
Jay Geeth
404

Parece que você fica sem memória de troca, tente isso

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

como mencionado por @ BlackBurn027 nos comentários abaixo, esta solução foi descrita aqui

Aditya Kresna Permana
fonte
27
Você é um gênio - não é um problema de php e remover arquivos não ajudará. Eu tenho que seguir suas instruções (com sudo) no meu VPS. Essa é a única resposta útil aqui para os proprietários de VPS.
Croll
4
getcomposer.org/doc/articles/... como mencionado pela fonte
BlackBurn027
1
Isso funcionou para mim, mas estou confuso sobre o que esses comandos estão realmente fazendo, alguém pode explicá-los?
Joseph Astrahan
2
às vezes 1024 não é suficiente ... Use 2,048 vez
psylosss
1
@JaberAlNahian você pode fazer uma troca definitiva por favor, verifique aqui digitalocean.com/community/tutorials/...
Mohammed Omer
78

Como guia de solução de problemas do compositor aqui Isso pode estar acontecendo porque o VPS fica sem memória e não possui espaço de troca ativado.

free -m

Para ativar a troca, você pode usar, por exemplo:

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1

Ou, se acima não funcionou, você pode tentar criar um arquivo de troca

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Umair Hamid
fonte
graças a lot sem php5 atualização para php7 isso funcionou
Shadab K
Você tem que executá-lo em CLI de Linux
Umair Hamid
Ele deu o erro novamente, mas executar a atualização do compositor depois disso funcionou bem.
Amir Hajiha 02/12/19
E você pode conferir o [documento oficial] [2] getcomposer.org/doc/articles/…
Thilina Dharmasena
38

Eu enfrentei o mesmo problema. Estou em uma microinstância gratuita da AWS que possui menos memória. Eu sempre tento uma das opções abaixo e sempre funciona (antes de tudo isso, verifique se você tem a versão mais recente do compositor instalada)

sudo php -dmemory_limit=750M composer.phar update

ou remova o conteúdo da pasta do fornecedor e tente atualizar o compositor.

sudo rm -rf vendor
sudo php -dmemory_limit=750M composer.phar update --no-scripts --prefer-dist
sudo php artisan --dump-autoload

A segunda opção tenta atualizar todos os componentes; se não houver atualização, ele pega o pacote no cache ou o arquivo dist

Nota: Altere o limite de memória conforme sua escolha.

ou

Crie uma partição de troca e tente. A partição de troca é a parte do disco rígido que o linux usa como memória virtual quando fica sem memória física. É semelhante ao arquivo de troca do Windows apenas em vez de usar um arquivo real, o linux usa uma partição no disco rígido.

Espero que isto ajude

Abishek
fonte
1
Eu reduzi o limite de memória para 500M e o compositor instalou o que eu precisava.
precisa saber é o seguinte
você também pode usar um arquivo de troca real em vez de uma partição. veja cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04
2
Teve mesmo problema no meu Oceano Digital conta mesmo em 250M Eu também tive que parar o Apache e MySQL primeiro antes que eu pudesse executá-lo
tristanbailey
tristanbailey sua solução funcionou, obrigado! Antes de parar o mysql e o apache, não conseguia atualizar, mesmo definindo o limite de memória php.
Elias Kouskoumvekakis 6/12/2015
Quando executo sudo php -dmemory_limit=750M composer.phar update esse erro, Could not open input file: composer.pharpor favor ajude
Varun Naharia
15

Fácil, digite estes comandos:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Deve funcionar para máquinas com pouca memória

inscrição
fonte
Trabalhou para mim. Eu escrevi uma resposta abrangente para cá - stackoverflow.com/questions/26850332/...
halkujabra
Não está funcionando. E isso excluiu toda a minha pasta de fornecedores. Está errado!
Vladimir Kovalchuk
Qual é o problema para excluir o fornecedor? basta executar instalar / atualizar novamente ...
insira
1
A exclusão do fornecedor não está totalmente errada, embora ele quebre o site e o mantenha no estado de falha se a instalação ainda não funcionar. No entanto, não é recomendável excluir o arquivo de bloqueio nas máquinas de produção. Você deve confirmar seu arquivo de bloqueio e apenas instalar, não atualizar. De fato, ao excluir o arquivo de bloqueio, você está forçando o Composer a instalar a partir do arquivo json, que é a origem dos processos que consomem muita memória (determinando qual versão do que instalar).
Shauna
É ok para seguir este se você não está em um ambiente de produção, uma vez que vai quebrar o projeto até que o compositor é feito com a instalação
Bizarro
11

Aqui estão as etapas para corrigir o problema: (método de alocação rápida e instantânea de arquivo SWAP usado)

Configuração do SWAP do servidor (Ubuntu 16.04 SWAP para corrigir erros de falta de memória)

Verifique se você já possui swap, memória e tamanho do disco:

    sudo swapon -s
    free -m
    df -h

Crie um arquivo de permuta: (altere 1G para 4G se você quiser 4GB de memória SWAP)

    sudo fallocate -l 1G /swapfile 

Verifique o arquivo de troca:

    ls -lh /swapfile

Atribuir arquivo de troca:

    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile

Verifique se a troca está OK, memória e tamanho do disco:

    sudo swapon -s
    free -m
    df -h

Anexar arquivo de troca na reinicialização do sistema:

    sudo nano /etc/fstab
        /swapfile   none    swap    sw    0   0

Ajuste as configurações do arquivo de troca:

    cat /proc/sys/vm/swappiness
    cat /proc/sys/vm/vfs_cache_pressure

    sudo sysctl vm.swappiness=10
    sudo sysctl vm.vfs_cache_pressure=50

    sudo nano /etc/sysctl.conf

Prioridade de arquivo SWAP: (0-100% => 0: Não coloque para trocar, 100: Coloque em SWAP e libere a RAM)

        vm.swappiness=10

Remover inode do cache: (100: o sistema remove as informações do inode do cache muito rapidamente)

        vm.vfs_cache_pressure = 50
Tarik
fonte
Não sei o que tenho que fazer na última etapa sudo nano /etc/sysctl.conf. Então, pulo, reinicio o Nginx e o faço composer install(anteriormente removi o diretório do fornecedor) e está funcionando. Obrigado!
Arhakim 24/10/19
10

Eu tive um mesmo problema no vagrant. Corrigi-o por alocar mais memória.

 config.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
 end
Yann 叶
fonte
1
Também resolveu esse problema para mim. Observe que no vagrant 2.x, em vez de vb.customize ...você pode fazer vb.memory = 1024.
Acobster 21/10
10

Experimentar

é basicamente aumentar a memória de troca

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 && sudo /sbin/mkswap /var/swap.1 && sudo /sbin/swapon /var/swap.1

jeidison farias
fonte
6
Por favor, adicione alguma explicação à sua resposta para que outras pessoas possam aprender com ela.
Nico Haase
Concordo que isso deveria ter mais explicações, mas funcionou para mim (basicamente aumentando a memória de troca). Obrigado!
user1015214
8

Tente isso:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1
Ayo 'Lana
fonte
1
Por favor, adicione alguma explicação à sua resposta para que outras pessoas possam aprender com ela - especialmente: o que você mudou em comparação com as outras respostas que usam a mesma abordagem? É necessário duplicar a resposta?
Nico Haase
7

Aqui está a solução alternativa que eu achei que funciona para mim todas as vezes:

df -h 
dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo 'echo "/swapfile  none  swap  defaults  0  0" >> /etc/fstab' | sudo sh

free -m

confirm u see your swap there:
total used free shared buffers cached
Mem: 494 335 158 0 19 62
-/+ buffers/cache: 254 240
Swap: 1023 3 1020

watch free -m
Goran
fonte
5
Uau, postar os comandos sem explicar o que eles fazem é provavelmente perigoso! Embora eu possa dizer definitivamente que funcionaria na maioria dos sistemas. Basicamente, você está criando um espaço de troca de alocação para que o HD possa ser usado como RAM. Aqui está um guia completo sobre como fazer isso explicando cada comando: digitalocean.com/community/tutorials/...
adelriosantiago
Obrigado pelo esclarecimento dos comandos, é bom saber o que o script realmente faz antes de executá-lo. Mas, da mesma forma, não é legal como você está promovendo o oceano digital e seu tutorial / postagem no blog.
Goran
O tutorial é ótimo, mostrando passo a passo com explicações!
Tarik
Obrigado! Você instruções me ajuda a instalar o Drupal Presto para servidor de 1 GB de RAM. Eu mudei 1024 para 2048.
Nikit 02/09/19
7

Eu tentei apenas excluindo a pasta do fornecedor e o arquivo composer.lock e, em seguida, executo o comando composer clear-cachee, em seguida composer install. Por isso, funciona sem nenhum erro.

Manjunath A
fonte
6

você pode usar o seguinte para verificar sua memória livre (swap)

free -m

total used free shared buffers cached

Mem: 2048 357 1690 0 0 237
-/+ buffers/cache: 119 1928
Swap: 0 0 0

Para ativar a troca, você pode usar, por exemplo:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
Rishi Ranjan
fonte
Eu usei free -me percebeu que não tinha memória, nem mesmo em troca .. então fez sudo reboote funcionou
Eleazar Resendez
4

Este parece ser um problema recorrente com 1 GB e instâncias de servidor menores. Além de tentar encerrar os processos e ajustar as configurações de troca, você pode instalar em uma máquina local e fazer o upload.

Makita
fonte
1
Sim. O engraçado é que, se eu excluir o projeto inteiro, fizer um novo git pull e instalar o compositor, ele parece funcionar. Estranho.
Ericbae 08/08/13
Frustrante, estou implantando alguns projetos L4 em instâncias de 1 GB Linode e agora estou preocupado em atingir o limite máximo de memória.
Makita
Um link antigo, mas pode ser de alguma utilidade: github.com/composer/composer/issues/1104
Makita
2
A resposta aceita ainda é o melhor caminho a percorrer. Você deve confirmar o compositer.lock e, em seguida, executar uma instalação em vez de atualizar no servidor de produção.
Makita
3

Às vezes, pelo compositor com atualização automática, resolve o problema

php composer.phar self-update

Felicidades

Titogelo
fonte
Essa deve ser a primeira coisa a tentar corrigir o problema. Eu tive um problema com o 1.3.3, a atualização automática para a 1.4.0 corrigiu o problema. Dica: você pode atualizar sua resposta para abranger também o caso de uso de composer self-update, se alguém não tão familiarizado com o compositor quiser ler esta resposta.
Niklaus
obter permissão negada quando renomeação ocorre
Andrew
3

Tente o seguinte:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

Este trabalho para mim no Centos 6

Adonias Vasquez
fonte
isso funcionou para mim na instância do AWS Opsworks EC2 Ubuntu 14.04! Obrigado!
Paul Preibisch
3

Aumentei o PHP memory_limitdos 128M padrão para 512M e reiniciei o servidor. Isso resolveu o problema.

Aris
fonte
3
A reinicialização não deve ser necessária, pois o PHP não é executado como um serviço.
HelpNeeder
1
Não, mas o Apache faz e, portanto, deve ser reiniciado para entrar em vigor ...
Dediqated
1
é necessário, pois o apache carrega os módulos php
Aris
2

Eu entro nessa situação na maioria das vezes, então normalmente eu seguia a etapa de definir a memória de troca.

Mas agora encontrei um truque alternativo simples que funcionou para mim.

Executar composer update --no-devdiferente decomposer update

Bastin Robin
fonte
2

Eu resolvi o mesmo problema no Vagrant. Eu aumentei o valor de memory_limit e cache de compositor de exclusão: sudo rm -R ~ / .composer e recarga finalmente vagabundo.

oussaka
fonte
1

tenho o mesmo problema com a atualização php composer.phar na minha hospedagem 512mb.

resolvido com o php composer.phar install

Ivan Proskuryakov
fonte
1

Faça uma troca e execute o comando do compositor novamente. Espero que funcione para você.

 $ dd if=/dev/zero of=/swapfile bs=1024 count=512k
 $ mkswap /swapfile
 $ swapon /swapfile
 $ echo "/swapfile       none    swap    sw      0       0 " >> /etc/fstab
 $ echo 0 > /proc/sys/vm/swappiness
 $ chown root:root /swapfile
 $ chmod 0600 /swapfile
nixon1333
fonte
1

No meu caso, tentei tudo o que foi listado acima. Eu estava usando o Laravel e o Vagrant com 4 GB de memória e uma troca, com o limite de memória definido como -1. Eu apaguei o fornecedor / e tentei outras versões do PHP. Finalmente, eu consegui trabalhar executando

vagrant halt
vagrant up

E então a instalação do compositor funcionou novamente como de costume.

PHZ.fi-Pharazon
fonte
0

Eu tive um problema semelhante no servidor mais barato (512 MB de RAM) hospedado no DigitalOcean e também estava executando o Jenkins CI no mesmo servidor. Depois que parei a instância do Jenkins, o comando de instalação do compositor funcionou (até certo ponto, ele falhou com a extensão mcrypt ausente, além de já estar instalada!).

Talvez se você tiver outro aplicativo em execução no servidor, talvez valha a pena tentar pará-lo e executar novamente o comando.

Chris
fonte
0

Desative o pacote js e aumente a memória. Isso deve consertar. Corrigi o meu desativando o pacote js.

obrigado

mani mann
fonte
Compartilhe mais detalhes sobre sua resposta - por que desativar a ajuda do "js bundling" quando ocorre um erro ao baixar um pacote (o que acontece muito antes de qualquer script ser executado)
Nico Haase
-1

edite o arquivo php.ini e aumente o valor memory_limit.

memory_limit = 1G

resolverá esse problema.

Amjith
fonte
-1
composer update

Loading composer repositories with package information
Updating dependencies (including require-dev)

> mmap () falhou: [12] Não é possível alocar memória

Atualize a memória no servidor e exija '4G' Alterar 4 GB de RAM [tente alterar o tipo de servidor ou adicione mais memória]

2 arquivos que precisamos editar


no comando

# cd /var/www/html
# nano .htaccess

e edite "memory_limit 756M”para4G


Php ini no php 7.0

# cd ~
# php –-ini
# sudo nano /etc/php-7.0.ini

memory_limit = 128M a 4G

#AWS #AMAZONLINUX # MAGENTO2 # PHP7.0

SUNNETmedia
fonte
1
Por favor, adicione algumas explicações à sua resposta. Mudar qualquer coisa .htaccessnão afeta, composerafinal, como isso não é executado em um servidor da web
Nico Haase