Error de actualización de PHP Composer "no se puede asignar memoria" (usando Laravel 4)

168

Simplemente no puedo resolver este.

Estoy en el plan básico de Linode 1G RAM. Intento instalar un paquete a través de Composer y no me lo permite. Mi límite de memoria está establecido en "-1" en PHP.ini

¿Hay algo más que pueda hacer para instalar esto?

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
fuente

Respuestas:

96

Un poco viejo, pero en caso de que alguien nuevo esté buscando una solución, actualizar su versión de PHP puede solucionar el problema.

También debe confirmar su archivo composer.lock y realizar una instalación de compositor en un entorno de producción que requiere menos recursos.

Más detalles aquí: https://github.com/composer/composer/issues/1898#issuecomment-23453850

fl3x7
fuente
12
¡BRILLANTE! Eso funciono. No actualicé mi PHP, pero al comprometer el archivo composer.lock y la actualización instalé todas las cosas correctamente. Gracias.
ericbae
66
Tarde a la fiesta, pero simplemente apagué Apache y MySQL. Hay una razón por la que estoy usando un VPS de 512 MB de RAM, no quiero gastar dinero.
Kumar
11
Actualizar PHP no es una solución. Tengo 7.0.21 y todavía recibo este error.
cj5
La solución de @ Kumar funcionó para mí. Súper fácil y como la mayoría de las cosas, obvio en retrospectiva :)
James Bridgewater
Muchas gracias. Me ahorró un montón de tiempo.
Jay Geeth
404

Parece que te quedas sin memoria de intercambio, prueba esto

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

Como se menciona por @ BlackBurn027 en los comentarios a continuación, esta solución se describió aquí

Aditya Kresna Permana
fuente
27
Señor, es un genio, no es un problema de php y eliminar archivos no será de ayuda. Tengo que seguir sus instrucciones (con sudo) en mi VPS. Esta es la única respuesta útil aquí para los propietarios de VPS.
Croll
44
getcomposer.org/doc/articles/… como lo mencionó la fuente
BlackBurn027
1
Esto funcionó para mí, pero estoy confundido sobre lo que están haciendo esos comandos, ¿alguien puede explicarlos?
Joseph Astrahan
2
a veces 1024 no es suficiente ... Use 2048 en su lugar
psylosss
1
@JaberAlNahian puede hacer un intercambio permanente, consulte aquí digitalocean.com/community/tutorials/…
Mohammed Omer
78

Como guía de solución de problemas del compositor aquí Esto podría estar sucediendo porque el VPS se queda sin memoria y no tiene habilitado el espacio de intercambio.

free -m

Para habilitar el intercambio, puede usar, por ejemplo:

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

O si lo anterior no funciona, puede intentar crear un archivo de intercambio

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Umair Hamid
fuente
muchas gracias sin actualizar php5 a php7 esto funcionó
Shadab K
Tienes que ejecutarlo en CLI de Linux
Umair Hamid
Volvió a dar el error, pero ejecutar la actualización del compositor después de eso funcionó bien.
Amir Hajiha
Y puede consultar el [documento oficial] [2] getcomposer.org/doc/articles/…
Thilina Dharmasena
38

Me he enfrentado al mismo problema. Estoy en una microinstancia gratuita de AWS que tiene menos memoria. Siempre pruebo una de las siguientes opciones y siempre funciona (antes de todo esto, compruebe si tiene instalada la última versión del compositor)

sudo php -dmemory_limit=750M composer.phar update

o elimine el contenido de la carpeta del proveedor e intente actualizar el compositor.

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

La segunda opción intenta actualizar todos los componentes, si no hay actualización, recoge el paquete de la caché, de lo contrario, recoge el paquete

Nota: Cambie el límite de memoria según su elección.

o

Crea una partición de intercambio e inténtalo. La partición de intercambio es la parte del disco duro que Linux usa como memoria virtual cuando se queda sin memoria física. Es similar al archivo de intercambio de Windows solo en lugar de usar un archivo real, Linux usa una partición en el disco duro.

Espero que esto ayude

Abishek
fuente
1
Bajé el límite de memoria a 500M y el compositor instaló lo que necesitaba.
devNoise
También puede usar un archivo de intercambio real en lugar de una partición. ver cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04
2
Tuve el mismo problema en mi cuenta de Digital Ocean, incluso a 250M. También tuve que detener Apache y MySQL antes de poder ejecutarlo
tristanbailey
tristanbailey su solución funcionó, gracias! Antes de detener mysql y apache no pude actualizar, incluso estableciendo el límite de memoria php.
Elias Kouskoumvekakis
Cuando ejecuto sudo php -dmemory_limit=750M composer.phar update , recibí este error, Could not open input file: composer.pharpor favor ayuda
Varun Naharia
15

Fácil, escriba estos comandos:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Debería funcionar para máquinas con poca memoria

insignificante
fuente
Trabajó para mi. He escrito una respuesta completa aquí - stackoverflow.com/questions/26850332/…
halkujabra
No funciona. Y esto eliminó toda mi carpeta de proveedor. ¡Está incorrecto!
Vladimir Kovalchuk
¿Cuál es el problema eliminar al vendedor? simplemente ejecute instalar / actualizar de nuevo ...
insign
1
La eliminación del proveedor no está del todo mal, aunque rompe el sitio y lo mantiene en estado roto si la instalación aún no funciona. Sin embargo, no se recomienda eliminar el archivo de bloqueo en las máquinas de producción. Debería confirmar su archivo de bloqueo y solo instalarlo, no actualizarlo. De hecho, al eliminar el archivo de bloqueo, está obligando a Composer a instalar desde el archivo json, que es de donde provienen los procesos de uso intensivo de memoria (determinando qué versión de qué instalar).
Shauna
Está bien seguir esto si no está en un entorno de producción, ya que interrumpirá el proyecto hasta que el compositor haya terminado con la instalación
Bizarro
11

Estos son los pasos para solucionar el problema: (método de asignación de archivos SWAP rápido instantáneo utilizado)

Configuración de SWAP del servidor (Ubuntu 16.04 SWAP para corregir errores de memoria insuficiente)

Compruebe si ya ha intercambiado, memoria y tamaño de disco:

    sudo swapon -s
    free -m
    df -h

Hacer un archivo de intercambio: (cambie 1G a 4G si desea una memoria SWAP de 4GB)

    sudo fallocate -l 1G /swapfile 

Verifique el archivo de intercambio:

    ls -lh /swapfile

Asignar archivo de intercambio:

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

Compruebe si intercambia OK, memoria y tamaño de disco:

    sudo swapon -s
    free -m
    df -h

Adjuntar archivo de intercambio al reiniciar el sistema:

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

Ajuste la configuración del archivo de intercambio:

    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

Prioridad de archivo SWAP: (0-100% => 0: No poner para intercambiar, 100: Poner SWAP y liberar la RAM)

        vm.swappiness=10

Eliminar el inodo del caché: (100: el sistema elimina la información del inodo del caché demasiado rápido)

        vm.vfs_cache_pressure = 50
Tarik
fuente
No sé qué tengo que hacer en el último paso sudo nano /etc/sysctl.conf, así que lo omito, luego reinicio Nginx y luego lo hago composer install(anteriormente eliminé el directorio de proveedores) y está funcionando. ¡Gracias!
arhakim
10

Tuve un mismo problema en vagabundo. Lo arreglé por allcate más memoria.

 config.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
 end
Yann 叶
fuente
1
También resolvió este problema para mí. Tenga en cuenta que en vagabundo 2.x en lugar de vb.customize ...usted puede hacer vb.memory = 1024.
acobster
10

Tratar

básicamente está elevando la memoria de intercambio

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
fuente
66
Agregue alguna explicación a su respuesta para que otros puedan aprender de ella.
Nico Haase
Estoy de acuerdo en que esto debería tener más explicaciones, pero funcionó para mí (básicamente está aumentando la memoria de intercambio). ¡Gracias!
user1015214
8

Trata eso:

/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
fuente
1
Agregue alguna explicación a su respuesta para que otros puedan aprender de ella, especialmente: ¿qué ha cambiado en comparación con las otras respuestas que utilizan el mismo enfoque? ¿Hay alguna necesidad de duplicar su respuesta?
Nico Haase
7

Aquí está la solución que encontré que siempre me funciona:

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
fuente
55
Wowwow, publicar los comandos sin explicar lo que hacen es probablemente peligroso. Aunque definitivamente puedo decir que funcionaría en la mayoría de los sistemas. Básicamente, está creando la asignación de espacio de intercambio para que el HD se pueda usar como RAM. Aquí hay una guía completa sobre cómo hacerlo explicando cada comando: digitalocean.com/community/tutorials/…
adelriosantiago
Gracias por la aclaración de los comandos, es bueno saber qué hace realmente el script antes de ejecutarlo. Pero de la misma manera, no es agradable cómo promociona el océano digital y su tutorial / publicación de blog.
Goran
¡El tutorial es genial y muestra paso a paso explicaciones!
Tarik
¡Gracias! Sus instrucciones me ayudan a instalar Drupal Presto para un servidor RAM de 1GB. Tengo cambio de 1024 a 2048.
Nikit
7

Lo intenté simplemente eliminando la carpeta del proveedor y el archivo composer.lock y luego ejecuté el comando composer clear-cachey luego composer install. Entonces funciona sin ningún error.

Manjunath A
fuente
6

puede usar lo siguiente para verificar su memoria libre (intercambio)

free -m

total used free shared buffers cached

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

Para habilitar el intercambio, puede usar, por ejemplo:

/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
fuente
Usé free -my noté que no tenía memoria, ni siquiera en el intercambio ... luego lo hice sudo rebooty funcionó
Eleazar Resendez
4

Esto parece ser un problema recurrente con instancias de servidor de 1GB y más pequeñas. Además de intentar cerrar los procesos y modificar la configuración de intercambio, puede instalar en una máquina local y cargar.

Makita
fuente
1
Sí. Lo curioso es que si elimino todo el proyecto, hago un nuevo git pull y luego hago la instalación del compositor, parece que funciona. Extraño.
ericbae
Frustrante, estoy desplegando algunos proyectos L4 en instancias de 1 GB de Linode y ahora estoy preocupado por llegar al límite de la memoria.
Makita
Un enlace antiguo pero puede ser útil: github.com/composer/composer/issues/1104
Makita
2
La respuesta aceptada sigue siendo el mejor camino a seguir. Debe confirmar composer.lock y luego ejecutar una instalación en lugar de actualizar en el servidor de producción.
Makita
3

A veces, al actualizar el compositor, resuelve el problema

php composer.phar self-update

Salud

Titogelo
fuente
Esto debería ser lo primero que intente solucionar el problema. Tuve un problema con 1.3.3, la actualización automática a 1.4.0 solucionó el problema. Sugerencia: puede actualizar su respuesta para cubrir también cubrir el caso de uso de composer self-update, si alguien no tan familiarizado con el compositor debe leer esta respuesta.
Niklaus
obtener el permiso denegado cuando se produce el cambio de nombre
Andrew
3

Prueba esto:

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

Este trabajo para mí en Centos 6

Adonias Vasquez
fuente
¡Esto funcionó para mí en la instancia de AWS Opsworks EC2 Ubuntu 14.04! ¡Gracias!
Paul Preibisch
3

Aumenté el PHP memory_limitdel predeterminado 128M a 512M y reinicié el servidor. Eso resolvió el problema.

Aris
fuente
3
reiniciar no debería ser necesario ya que PHP no se ejecuta como un servicio.
HelpNeeder
1
No, pero Apache lo hace y, por lo tanto, debe reiniciarse para que surta efecto ...
Dediqated
1
es necesario, ya que apache carga los módulos php
Aris
2

Me meto en esta situación la mayoría de las veces, así que normalmente solía seguir el paso de configurar la memoria de intercambio.

Pero ahora encontré un truco alternativo simple que funcionó para mí.

Ejecutar composer update --no-devOtro quecomposer update

Bastin Robin
fuente
2

Resolví el mismo problema en Vagrant. Aumenté el valor de memory_limit y eliminé el caché del compositor: sudo rm -R ~ / .composer y finalmente recargué vagabundo.

oussaka
fuente
1

tengo el mismo problema con la actualización de php composer.phar en mi hosting de 512 MB.

resuelto con php composer.phar install

Ivan Proskuryakov
fuente
1

Realice un intercambio y vuelva a ejecutar el comando compositor. Espero que funcione para ti.

 $ 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
fuente
1

En mi caso, probé todo lo que se mencionó anteriormente. Estaba usando Laravel y Vagrant con 4 GB de memoria y un intercambio, con el límite de memoria establecido en -1. Eliminé el proveedor y probé otras versiones de PHP. Finalmente, logré que funcione ejecutando

vagrant halt
vagrant up

Y luego la instalación del compositor funcionó nuevamente como de costumbre.

PHZ.fi-Pharazon
fuente
0

Tuve un problema similar en el servidor más barato (512 MB de RAM) alojado con DigitalOcean , y también estaba ejecutando Jenkins CI en el mismo servidor. Después de que detuve la instancia de Jenkins, el comando de instalación del compositor funcionó (bueno, hasta cierto punto, ¡falló porque faltaba la extensión mcrypt además de estar ya instalada!).

Quizás si tienes otra aplicación ejecutándose en el servidor, quizás valga la pena intentar detenerla y volver a ejecutar el comando.

Chris
fuente
0

Deshabilite js bundling y aumente la memoria. Eso debería arreglarlo. Arreglé el mío deshabilitando js bundling.

Gracias

mani mann
fuente
Comparta más detalles sobre su respuesta: ¿por qué debería deshabilitar la ayuda de "js bundling" cuando se produce un error al descargar un paquete (que ocurre mucho antes de que se ejecuten los scripts)
Nico Haase
-1

edite el archivo php.ini y aumente el valor de memory_limit.

memory_limit = 1G

Resolverá este problema.

Amjith
fuente
-1
composer update

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

> mmap () falló: [12] No se puede asignar memoria

Actualice la memoria en el servidor y requiera '4G' Cambie 4GB de RAM [intente cambiar el tipo de servidor o agregue más ram]

2 archivos que necesitamos editar


en comando

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

y editar "memory_limit 756M”a4G


Php ini en php 7.0

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

memoria_limit = 128M a 4G

#AWS #AMAZONLINUX # MAGENTO2 # PHP7.0

SUNNETmedia
fuente
1
Agregue alguna explicación a su respuesta. Después de todo, cambiar cualquier cosa .htaccessno afecta composer, ya que esto no se ejecuta a través de un servidor web
Nico Haase