Error Tracking

Frequentemente ao executar uma atualização de pacotes com composer, utilizando o comando composer update o erro Composer update proc_open(): fork failed errors é lançado por falta de memória na máquina virtual vagrant que utilizo no ambiente de desenvolvimento. A seguir uma listagem completa dos erros listados:

The following exception is caused by a lack of memory and not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 954
PHP Stack trace:
PHP   1. {main}() /usr/local/bin/composer:0
PHP   2. require() /usr/local/bin/composer:24
PHP   3. Composer\Console\Application->run() phar:///usr/local/bin/composer/bin/composer:43
PHP   4. Symfony\Component\Console\Application->run() phar:///usr/local/bin/composer/src/Composer/Console/Application.php:104
PHP   5. Symfony\Component\Console\Application->renderException() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:130
PHP   6. Symfony\Component\Console\Application->getTerminalWidth() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:648
PHP   7. Symfony\Component\Console\Application->getTerminalDimensions() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:715
PHP   8. Symfony\Component\Console\Application->getSttyColumns() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:754
PHP   9. proc_open() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:954

Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 954

Call Stack:
    0.0002     226568   1. {main}() /usr/local/bin/composer:0
    0.0050     437880   2. require('phar:///usr/local/bin/composer/bin/composer') /usr/local/bin/composer:24
    0.0268    4427224   3. Composer\Console\Application->run() phar:///usr/local/bin/composer/bin/composer:43
    0.0290    4823392   4. Symfony\Component\Console\Application->run() phar:///usr/local/bin/composer/src/Composer/Console/Application.php:104
   38.7588  168764944   5. Symfony\Component\Console\Application->renderException() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:130
   38.8999  168765432   6. Symfony\Component\Console\Application->getTerminalWidth() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:648
   38.8999  168765584   7. Symfony\Component\Console\Application->getTerminalDimensions() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:715
   38.8999  168765680   8. Symfony\Component\Console\Application->getSttyColumns() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:754
   38.8999  168767640   9. proc_open() phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:954

                                                     
  [ErrorException]                                   
  proc_open(): fork failed - Cannot allocate memory



Isto acontece devido ao alto consumo de memória do Composer, em uma máquina virtual onde não existe uma configuração de espaço para disco de swap. Podemos resolver isto executando os passos descritos na seção a seguir.

Corrigindo o erro: Composer update proc_open(): fork failed errors

Apesar das orientações de aumentar o limite de memória utilizado, indicados na própria documentação do composer, a melhor solução que encontrei é a de criar um disco de swap na máquina vagrant.

A indicação de aumentar o limite de memória pode ser realizada com o seguinte comando: php -d memory_limit=-1 /usr/local/bin/composer.phar update.

Para criar a área de swap na máquina virtual, primeiramente confirme que ela não existem, executando o seguinte comando:

$ free -m

total used free shared buffers cached
Mem: 2048 357 1690 0 0 237
-/+ buffers/cache: 119 1928
Swap: 0 0 0

Verifique se a saída é igual à ultima linha listada acima: Swap: 0 0 0, isto indica a ausência da memória swap. Para criá-la execute os seguintes comandos:

Atenção talvez seja necessário executar os comandos a seguir com permissões de administrador por meio do uso de sudo.

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

Você pode baixar este script do repositório shell-helpers no Github, ou executar o comando a seguir que faz o download e execução do script:

wget -O - https://raw.githubusercontent.com/nunomazer/shell-helpers/master/swap-for-vm.sh | sudo sh

Por fim, execute novamente composer update e verifique os pacotes sendo instalados sem problemas.

Note que esta solução pode ser utilizada em servidores compartilhados ou VPS como Digital Ocean, GoDaddy, Forge ou outros, desde que você tenha acesso ssh a eles.

Pin It on Pinterest

Share This

Share This

Share this post with your friends!