Límite de memoria de actualización del compositor


85

Necesito ejecutar la actualización del compositor en mi alojamiento, así que inicio sesión con ssh e intento ejecutar comand:

composer update

dentro de la carpeta / www donde tengo laravel y la instalación del compositor

pero me sale un error: ingrese la descripción de la imagen aquí

en contacto con mi proveedor de alojamiento me dicen que ejecute el comando:

php -d memory_limit=512M composer update

Ejecuto este comando pero obtengo: "No se pudo abrir el archivo: compositor"

¿Qué hacer? ¿Cuál es la solución aquí?


2
Como dijo @Sven, en producción composer installes suficiente. En su caso, mientras usa un hosting compartido, creo que no podrá composer updatetrabajar, así que la única forma es comprar un hosting VPS como Digital Ocean, Linode.
Lucas Silva

Respuestas:


131

Cuando ejecute composer update, el sistema operativo buscará en las rutas configuradas e intentará localizar un archivo ejecutable con ese nombre.

Cuando se ejecuta php composer update, la composercadena se trata como un parámetro de PHP, que no se busca en ninguna ruta. Debe proporcionar la ruta completa para ejecutarlo.

La ejecución which composerle dirá dónde encuentra el sistema operativo el ejecutable del compositor, y luego simplemente use la ruta completa en el comando PHP:

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

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

Tenga en cuenta que 512 MB pueden ser muy pocos. Mi percepción es que felizmente tomará 1GB o más, dependiendo de la cantidad de dependencias que uses y la variedad de versiones que teóricamente permitas, es decir, si permites Symfony ~2.3, entonces haces que Composer maneje muchas más versiones posibles en comparación con el uso ~2.7.

También tenga en cuenta que ejecutar Composer en la máquina de producción no es la mejor idea. Debería tener acceso a Github, tal vez proporcionar credenciales de acceso, tener herramientas VCS instaladas y romperá fácilmente su sitio si alguno de los servidores de alojamiento remoto está fuera de línea durante su actualización. Es una mejor idea usar Composer en un sistema de implementación que hace toda la preparación y luego mueve todos los archivos al servidor de producción.

Actualizar

Ahora estamos en el año 2020, y la forma en que Composer administra su memoria ha cambiado bastante. Lo más importante es que Composer aumentará el límite de memoria por sí mismo si encuentra un límite demasiado bajo. Sin embargo, esto desencadena inmediatamente el problema de quedarse sin memoria en máquinas que tienen muy poca memoria instalada. Puede hacer que Composer use menos memoria configurando la variable de entorno como COMPOSER_MEMORY_LIMIT=512M, pero esto creará problemas si Composer necesita más memoria para funcionar correctamente.

Mi punto principal sigue siendo cierto: no ejecute Composer en máquinas que tengan muy poca memoria instalada. Potencialmente, necesita 1,5 GB de memoria libre para poder actualizar todo.


Solo escribo: php -r "readfile (' getcomposer.org/installer' );" | php y después de eso todo funciona bien ... también GRACIAS POR LA AYUDA
Andrew

34
php -d memory_limit=-1 $(which composer) updatees más conveniente debido a que no es necesario especificar la ruta del compositor.
Rax

1
Esto es genial. No sabía que se podía aumentar la memoria con un solo comando. ¿Eso es lo que está haciendo bien?
plushyObject

como en windows?
Ray

1
@Rax una cosa más, si está ejecutando este comando en ventanas en MinGW entonces obtendrá un error que camino debe ser traducido a fin de utilizar este comandophp -d memory_limit=-1 $(which composer).phar update
Faizan

140

Configúrelo para usar tanta memoria como quiera con:

COMPOSER_MEMORY_LIMIT=-1 composer update

¿Cómo podemos establecer este valor o cualquier valor globalmente? en lugar de tener que hacer esto cada vez a través de CLI?
snh_nl

@snh_nl necesitará establecer el límite de memoria php. Ejemplo: chapterthree.com/blog/how-fix-composer-memory-issue
jasonflaherty

2
Defínalo globalmente en su / etc / profile (o cualquier shell que use) con COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMIT. ¿O definirlo como un alias de shell? alias memcomposer='COMPOSER_MEMORY_LIMIT=-1 composer', luego use en memcomposerlugar decomposer
diamondsea

Todavía diceFatal 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

Estoy enfrentando problemas con el compositor porque consume toda la memoria disponible, y luego, el proceso se mata (en realidad, el mensaje de salida es "Killed")

Entonces, estaba buscando una solución para limitar el uso de la memoria del compositor.

Lo intenté (de las respuestas de @Sven)

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

Pero no funcionó porque

"Composer aumenta internamente el memory_limit a 1.5G".

-> Eso es del sitio web oficial del compositor.

Entonces encontré un comando que funciona:

$ COMPOSER_MEMORY_LIMIT=512M php composer.phar update

Aunque, en mi caso, ¡512 MB no es suficiente!

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


1
Tuve que usar el compositor así: COMPOSER_MEMORY_LIMIT = 1024M composer require 'module'
jasonflaherty

1
Similar, uséCOMPOSER_MEMORY_LIMIT=-1 composer require <package name>
realtebo

12

Tuve que combinar COMPOSER_MEMORY_LIMITy memory_limiten la línea de comando:

En Windows:

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

En Linux:

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

Este es el único que me ha funcionado en Mac OS X El Capitan.
ymd_

Funcionó para mí, gracias
Sayydika

8

Si hay suficiente memoria, el compositor la consumirá internamente y se ejecutará sin ningún problema. No es necesario decirle específicamente al compositor que lo haga.

¿Ha intentado aumentar su memoria de intercambio, porque funcionó para mí? Aumenté la memoria de intercambio a 4096 Mb (4 GB) y ahora todo me parece genial.

primero use " sudo free" para ver la memoria disponible e intercambiar memoria. y configurar swap 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 que sea permanente, agregue esto al archivo / 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

puede aumentar su memoria de intercambio cambiando bs = 1024k o 2048k o 8096k dependiendo del tamaño de su volumen físico. use los comandos 'swapon' y swapoff para ver la diferencia.

comprobar 'intercambio' (60 debería funcionar bien)

cat /proc/sys/vm/swappiness

4

Puedes cambiar el memory_limit valor en su php.ini

Intente aumentar el límite en su archivo php.ini

Use -1 para ilimitado o defina un valor explícito como 2G

memory_limit = -1

Nota: Composer aumenta internamente el memory_limit a 1.5G.

Lea la documentación getcomposer.org


3

En MAC OS High Siera ejecuté lo siguiente:

MacBook-Pro:asiu jack$ php --ini

Devuelto:

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 las respuestas anteriores establecen la configuración cargada que se actualiza, pero observe que los archivos .ini adicionales analizados tienen php-memory-limits.ini como un archivo separado. También debe actualizar este límite de memoria de archivos. De la misma manera, abra en el editor de texto y cambie a algo como 2G. El resultado de la falla del límite de memoria debería indicarle cuánta memoria necesita para ejecutarse, simplemente configúrelo en un valor más alto o -1 para ilimitado.


2

Este error puede ocurrir especialmente cuando está actualizando bibliotecas grandes o bibliotecas con muchas dependencias. Composer puede tener mucha memoria.

Asegúrese de que su compositor esté actualizado a la última versión:

php composer.phar --self-update

Puede aumentar el límite de memoria para el compositor temporalmente agregando la variable de entorno del límite de memoria del compositor:

COMPOSER_MEMORY_LIMIT=128MB php composer.phar update

Utilice el formato "128M" para megabyte o "2G" para gigabyte. Puede utilizar el valor "-1" para ignorar el límite de memoria por completo.

Otra forma sería aumentar el límite de memoria de PHP:

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

1

¿Qué tamaño tiene su servidor AWS? Si solo tiene 1 GB de RAM, establecer el límite de memoria de 2 GB en php.ini no ayudará.

Si no puede / no desea aumentar también el lado del servidor para obtener más RAM disponible, también puede habilitar SWAP.

Consulte aquí cómo habilitar el intercambio. Permite 4 GB, aunque normalmente yo solo hago 1 GB.

Fuente: Obtenido del sitio laracast


1

La mejor solucion para mi es

COMPOSER_MEMORY_LIMIT=-1 composer require <package name>

mencionado por @realtebo


0

En mi caso, ninguna de las respuestas ayudó. Finalmente resultó que el cambio a una versión de 64 bits de PHP (M $ Windows) solucionó el problema de inmediato. No cambié ninguna configuración, simplemente funcionó.


0

Hice esto en Widnows 10 y trabajé conmigo:

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

Puede cambiar el valor xx que desee

 memory_limit=XX

0

Estoy ejecutando Laravel 6 con Homestead y también encontré este problema. Como se sugiere aquí en las otras respuestas, puede prefijar COMPOSER_MEMORY_LIMIT=-1un solo comando y ejecutar el comando normalmente. Si desea actualizar su configuración de PHP para permitir siempre memoria ilimitada, siga estos pasos.

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

Agregue memory_limit=-1a su archivo php.ini. Si tiene problemas para usar Vim o para realizar ediciones en el archivo php.ini, consulte esta respuesta sobre cómo editar el archivo php.ini con Vim. El archivo debería verse así:

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

Tenga en cuenta que esto podría consumir una cantidad infinita de memoria en su máquina. Probablemente no sea una buena idea para la producción jajaja. Con Laravel Valet tenía que seguir este artículo y actualizar el valor de la memoria aquí:

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

Luego reinicie el servidor con Valet:

valet restart

Esta respuesta también fue útil para cambiar la configuración con Laravel Valet en Mac para que los cambios surtan efecto.


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

3
Agregue alguna explicación a su respuesta para que otros puedan aprender de ella
Nico Haase



-1

En mi caso, necesitaba permisos más altos junto con este aumento del límite de memoria.

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

Ejecutar Composer con sudono es una buena idea, ya que confundirá tus permisos. Esto parece que estás corriendocomposer update en un servidor; también es una mala práctica, ya que hará que sea mucho más diferente poner las dependencias calculadas bajo el control de versiones
Nico Haase

De acuerdo con @NicoHaase, ¡debes tener mucho cuidado al usar esto! Gracias.
Naser Nikzad
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.