ขีด จำกัด หน่วยความจำอัพเดตผู้แต่ง


96

ฉันต้องเรียกใช้การอัปเดตผู้แต่งที่โฮสติ้งของฉันดังนั้นฉันจึงเข้าสู่ระบบด้วย ssh และพยายามเรียกใช้คำสั่ง

composer update

ภายใน / www โฟลเดอร์ที่ฉันมีการติดตั้ง Laravel และนักแต่งเพลง

แต่ฉันได้รับข้อผิดพลาด:

ใส่คำอธิบายภาพที่นี่

ในการติดต่อกับผู้ให้บริการโฮสติ้งของฉันพวกเขาบอกให้ฉันเรียกใช้คำสั่ง:

php -d memory_limit=512M composer update

ฉันเรียกใช้คำสั่งนี้ แต่ได้รับ: "ไม่สามารถเปิดไฟล์: นักแต่งเพลง"

จะทำอย่างไร? ทางออกที่นี่คืออะไร?


2
ดังที่ @Sven กล่าวว่าในการผลิตcomposer installก็เพียงพอแล้ว ในกรณีของคุณในขณะที่ใช้โฮสติ้งที่ใช้ร่วมกันฉันคิดว่าคุณจะไม่composer updateทำงานดังนั้นวิธีเดียวคือซื้อโฮสติ้ง VPS เช่น Digital Ocean, Linode
Lucas Silva

คำตอบ:


144

เมื่อคุณเรียกใช้composer updateระบบปฏิบัติการจะตรวจสอบเส้นทางที่กำหนดค่าไว้และพยายามค้นหาไฟล์ปฏิบัติการที่มีชื่อนั้น

เมื่อทำงานphp composer updateที่composerสตริงจะถือว่าเป็นพารามิเตอร์เพื่อ PHP, ซึ่งไม่ได้ค้นหาในเส้นทางใด ๆ คุณต้องระบุเส้นทางแบบเต็มเพื่อเรียกใช้

การรันwhich composerจะบอกให้คุณทราบว่าระบบปฏิบัติการพบตัวประมวลผลที่สามารถเรียกใช้งานได้จากที่ใดจากนั้นคุณเพียงแค่ใช้เส้นทางแบบเต็มในคำสั่ง PHP:

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

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

โปรดทราบว่า 512MB อาจน้อยเกินไป ความเข้าใจของฉันคือใช้เวลา 1GB ขึ้นไปอย่างมีความสุขขึ้นอยู่กับจำนวนการอ้างอิงที่คุณใช้และความหลากหลายของเวอร์ชันที่คุณอนุญาตในทางทฤษฎีกล่าวคือหากคุณอนุญาตให้ใช้ Symfony ~2.3คุณจะทำให้ Composer จัดการกับเวอร์ชันที่เป็นไปได้มากกว่าเมื่อเทียบกับการใช้~2.7.

โปรดทราบว่าการเรียกใช้ Composer บนเครื่องการผลิตไม่ใช่ความคิดที่ดีที่สุด คุณจะต้องมีสิทธิ์เข้าถึง Github อาจให้ข้อมูลรับรองการเข้าถึงติดตั้งเครื่องมือ VCS และคุณจะทำลายไซต์ของคุณได้อย่างง่ายดายหากเซิร์ฟเวอร์โฮสต์ระยะไกลออฟไลน์ระหว่างการอัปเดตของคุณ เป็นความคิดที่ดีกว่าในการใช้ Composer บนระบบการปรับใช้ที่ดำเนินการเตรียมการทั้งหมดจากนั้นย้ายไฟล์ทั้งหมดไปยังเซิร์ฟเวอร์ที่ใช้งานจริง

อัปเดต

ตอนนี้เป็นปี 2020 แล้วและวิธีการจัดการหน่วยความจำของ Composer ก็เปลี่ยนไปไม่น้อย สิ่งที่สำคัญที่สุดคือ Composer จะเพิ่มขีด จำกัด หน่วยความจำด้วยตัวเองหากพบว่าขีด จำกัด ที่ตั้งไว้ต่ำเกินไป อย่างไรก็ตามสิ่งนี้ทำให้เกิดปัญหาหน่วยความจำในเครื่องที่ติดตั้งหน่วยความจำน้อยเกินไปในทันที คุณสามารถทำให้ Composer ใช้หน่วยความจำน้อยลงได้โดยตั้งค่าตัวแปรสภาพแวดล้อมเช่นCOMPOSER_MEMORY_LIMIT=512Mนี้ แต่จะสร้างปัญหาหาก Composer ต้องการหน่วยความจำเพิ่มเติมเพื่อให้ทำงานได้อย่างถูกต้อง

ประเด็นหลักของฉันยังคงเป็นจริง: อย่าเรียกใช้ Composer บนเครื่องที่ติดตั้งหน่วยความจำน้อยเกินไป คุณอาจต้องการหน่วยความจำว่าง 1.5 GB เพื่ออัปเดตทุกอย่าง


ฉันแค่ wite: php -r "readfile (' getcomposer.org/installer' );" | php และหลังจากนั้นทุกอย่างก็ใช้ได้ดี ... ขอความช่วยเหลือด้วย
Andrew

41
php -d memory_limit=-1 $(which composer) updateสะดวกกว่าเนื่องจากไม่จำเป็นต้องระบุเส้นทางของผู้แต่ง
Rax

1
นี่มันเยี่ยมมาก ฉันไม่รู้ว่าคุณสามารถเพิ่มหน่วยความจำสำหรับคำสั่งเดียวได้ นั่นคือสิ่งที่ทำอยู่ใช่มั้ย?
plushyObject

ใน windows ได้อย่างไร?
Ray

1
@Rax อีกอย่างหนึ่งถ้าคุณกำลังเรียกใช้คำสั่งนี้ใน windows บน mingw คุณจะได้รับข้อผิดพลาดว่าต้องแปลเส้นทางดังนั้นให้ใช้คำสั่งนี้php -d memory_limit=-1 $(which composer).phar update
Faizan

156

ตั้งค่าให้ใช้หน่วยความจำได้มากเท่าที่ต้องการด้วย:

COMPOSER_MEMORY_LIMIT=-1 composer update

เราจะกำหนดค่านี้หรือมูลค่าใด ๆ ทั่วโลกได้อย่างไร? แทนที่จะต้องทำทุกครั้งผ่าน CLI?
snh_nl

@snh_nl คุณจะต้องตั้งค่าขีด จำกัด หน่วยความจำ php ตัวอย่าง: chapterthree.com/blog/how-fix-composer-memory-issue
jasonflaherty

2
กำหนดมันทั่วโลกใน / etc / โปรไฟล์ของคุณ (หรืออะไรก็ตามที่คุณใช้เปลือก) COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMITด้วย หรือกำหนดเป็นนามแฝงเชลล์? alias memcomposer='COMPOSER_MEMORY_LIMIT=-1 composer'แล้วใช้memcomposerแทนcomposer
diamondsea

มันยังคงพูดว่าFatal 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

ฉันกำลังประสบปัญหากับนักแต่งเพลงเพราะมันใช้หน่วยความจำที่มีอยู่ทั้งหมดและจากนั้นกระบวนการก็ถูกฆ่า (จริงๆแล้วข้อความที่ส่งออกคือ "Killed")

ดังนั้นฉันกำลังมองหาวิธีแก้ปัญหาเพื่อ จำกัด การใช้หน่วยความจำของผู้แต่ง

ฉันพยายาม (จากคำตอบของ @Sven)

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

แต่มันไม่ได้ผลเพราะ

"นักแต่งเพลงจะเพิ่ม memory_limit ภายในเป็น 1.5G"

-> นั่นมาจากผู้แต่งเว็บไซต์ทางการ

จากนั้นฉันพบคำสั่งที่ใช้งานได้:

$ COMPOSER_MEMORY_LIMIT=512M php composer.phar update

แม้ว่าในกรณีของฉัน 512MB ไม่เพียงพอ!

ที่มา: https://www.agileana.com/blog/composer-memory-limit-troubleshooting/


1
ฉันต้องใช้นักแต่งเพลงเช่นนี้: COMPOSER_MEMORY_LIMIT = 1024M นักแต่งเพลงต้องการ 'โมดูล'
jasonflaherty

1
คล้ายกันฉันใช้COMPOSER_MEMORY_LIMIT=-1 composer require <package name>
realtebo

13

ฉันต้องรวมCOMPOSER_MEMORY_LIMITและmemory_limitในบรรทัดคำสั่ง:

บน Windows:

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

บน Linux:

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

นี่เป็นเครื่องเดียวที่ใช้ได้กับฉันบน Mac OS X El Capitan
ymd_

12

ทางออกที่ดีที่สุดสำหรับฉันคือ

COMPOSER_MEMORY_LIMIT=-1 composer require <package-name>

กล่าวถึงโดย @realtebo


8

หากมีผู้แต่งหน่วยความจำเพียงพอจะใช้งานภายในและเรียกใช้โดยไม่มีปัญหาใด ๆ ไม่จำเป็นต้องบอกคนแต่งให้เป็นพิเศษ

คุณพยายามเพิ่มหน่วยความจำ swap ของคุณหรือไม่เพราะมันได้ผลสำหรับฉัน ฉันเพิ่มหน่วยความจำ swap เป็น 4096Mb (4GB) และตอนนี้ทุกอย่างก็ดูดีสำหรับฉัน

ครั้งแรกให้ใช้ " sudo free" เพื่อดูหน่วยความจำที่มีอยู่และสลับหน่วยความจำ และกำหนดค่าการแลกเปลี่ยนเป็น

สำหรับ 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

เพื่อให้เป็น permenant เพิ่มสิ่งนี้ในไฟล์ / etc / fstab /swapfile swap swap defaults 0 0

สำหรับ 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

คุณสามารถเพิ่มหน่วยความจำ swap ของคุณได้โดย changin bs = 1024k หรือ 2048k หรือ 8096k ขึ้นอยู่กับขนาดฟิสิคัลวอลุ่มของคุณ ใช้คำสั่ง 'swapon' และ swapoff เพื่อดูความแตกต่าง

ตรวจสอบ 'swappiness' (60 ควรทำดี)

cat /proc/sys/vm/swappiness

5

คุณสามารถเปลี่ยนmemory_limitค่าใน php.ini ของคุณ

ลองเพิ่มขีด จำกัด ในไฟล์ php.ini ของคุณ

ใช้ -1 เพื่อไม่ จำกัด หรือกำหนดค่าที่ชัดเจนเช่น 2G

memory_limit = -1

หมายเหตุ: Composer จะเพิ่ม memory_limit ภายในเป็น 1.5G

อ่านเอกสารgetcomposer.org


3

บน MAC OS High Siera ฉันรันด้านล่าง:

MacBook-Pro:asiu jack$ php --ini

ส่งคืน:

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

คำตอบทั้งหมดข้างต้นกำลังตั้งค่าการกำหนดค่าที่โหลดซึ่งจะอัปเดต แต่สังเกตว่าไฟล์. ini เพิ่มเติมที่แยกวิเคราะห์มี php-memory-LIMIT.ini เป็นไฟล์แยกต่างหาก คุณต้องอัปเดตขีด จำกัด หน่วยความจำของไฟล์นี้ด้วย วิธีเดียวกับที่เปิดในโปรแกรมแก้ไขข้อความและเปลี่ยนเป็นบางอย่างเช่น 2G ผลลัพธ์เกี่ยวกับความล้มเหลวของขีด จำกัด หน่วยความจำควรบอกคุณว่าต้องใช้หน่วยความจำเท่าใดเพียงตั้งค่าให้สูงกว่านั้นหรือ -1 สำหรับไม่ จำกัด


2

ข้อผิดพลาดนี้อาจเกิดขึ้นได้โดยเฉพาะอย่างยิ่งเมื่อคุณกำลังอัปเดตไลบรารีหรือไลบรารีขนาดใหญ่ที่มีการอ้างอิงจำนวนมาก นักแต่งเพลงสามารถค่อนข้างหิวความจำ

ตรวจสอบให้แน่ใจว่าผู้แต่งของคุณได้รับการอัปเดตเป็นเวอร์ชันล่าสุด:

php composer.phar --self-update

คุณสามารถเพิ่มขีด จำกัด หน่วยความจำสำหรับผู้แต่งชั่วคราวโดยการเพิ่มตัวแปรสภาพแวดล้อมขีด จำกัด หน่วยความจำคอมโพสิต:

COMPOSER_MEMORY_LIMIT=128MB php composer.phar update

ใช้รูปแบบ“ 128M” สำหรับเมกะไบต์หรือ“ 2G” สำหรับกิกะไบต์ คุณสามารถใช้ค่า“ -1” เพื่อละเว้นขีด จำกัด หน่วยความจำทั้งหมดได้

อีกวิธีหนึ่งคือการเพิ่มขีด จำกัด หน่วยความจำ PHP:

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

2

ฉันทำสิ่งนี้บน Windows 10 และทำงานร่วมกับฉัน:

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

คุณสามารถเปลี่ยนค่าxxที่คุณต้องการ

 memory_limit=XX

1

เซิร์ฟเวอร์ AWS ของคุณใหญ่แค่ไหน? หากมี ram เพียง 1gb การตั้งค่าขีด จำกัด หน่วยความจำ 2gb ใน php.ini จะไม่ช่วย

หากคุณไม่สามารถ / ไม่ต้องการเพิ่มฝั่งเซิร์ฟเวอร์เพื่อให้ได้ RAM มากขึ้นคุณสามารถเปิดใช้งาน SWAP ได้เช่นกัน

ดูวิธีการเปิดใช้งานการแลกเปลี่ยนได้ที่นี่ มันเปิดใช้งาน 4gb แม้ว่าโดยปกติแล้วฉันจะทำแค่ 1GB เอง

ที่มา: ได้มาจากเว็บไซต์ laracast


0

ในกรณีของฉันไม่มีคำตอบใดช่วยได้ ในที่สุดปรากฎว่าการเปลี่ยนเป็น PHP เวอร์ชัน 64 บิต (M $ Windows) ช่วยแก้ไขปัญหาได้ทันที ฉันไม่ได้เปลี่ยนการตั้งค่าใด ๆ - มันใช้งานได้จริง


0

ฉันใช้ Laravel 6 กับ Homestead และพบปัญหานี้ด้วย ตามที่แนะนำไว้ที่นี่ในคำตอบอื่น ๆ คุณสามารถนำหน้าCOMPOSER_MEMORY_LIMIT=-1คำสั่งเดียวและรันคำสั่งได้ตามปกติ หากคุณต้องการอัปเดตการกำหนดค่า PHP ให้อนุญาตหน่วยความจำไม่ จำกัด เสมอให้ทำตามขั้นตอนเหล่านี้

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

เพิ่มmemory_limit=-1ในไฟล์ php.ini ของคุณ หากคุณมีปัญหาในการใช้ Vim หรือทำการแก้ไขไฟล์ php.ini ให้ตรวจสอบคำตอบเกี่ยวกับวิธีแก้ไขไฟล์ php.ini ด้วย Vim ไฟล์ควรมีลักษณะดังนี้:

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

โปรดทราบว่าสิ่งนี้สามารถกินหน่วยความจำบนเครื่องของคุณได้ไม่ จำกัด อาจไม่ใช่ความคิดที่ดีสำหรับการผลิตฮ่า ๆ ด้วย Laravel Valet ต้องติดตามบทความนี้และอัปเดตค่าหน่วยความจำที่นี่:

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

จากนั้นรีสตาร์ทเซิร์ฟเวอร์ด้วย Valet:

valet restart

คำตอบนี้ยังมีประโยชน์สำหรับการเปลี่ยนการกำหนดค่าด้วย Laravel Valet บน Mac เพื่อให้การเปลี่ยนแปลงมีผล





0

สำหรับ Laravel

ขั้นตอนที่ 1. เปิดเทอร์มินัลของคุณ

ขั้นตอนที่ 2. cdลงในไดเร็กทอรี laravel ของคุณ

ขั้นตอนที่ 3 พิมพ์คำสั่งwhich composerในไดเร็กทอรี laravel ของคุณและจดบันทึกไดเร็กทอรีที่ผู้แต่งอาศัยอยู่

ขั้นตอนที่ 4. เรียกใช้คำสั่งphp -d memory_limit=-1 /opt/cpanel/bin/composer update(คุณสามารถเรียกใช้รหัสได้หากเหมาะกับคุณ)

(เปลี่ยน/opt/cpanel/bin/composerเส้นทางไดเร็กทอรีที่ส่งคืนในขั้นตอนที่ 3)

แก้ไขปัญหา



-1

ในกรณีของฉันมันต้องการการอนุญาตที่สูงขึ้นพร้อมกับการเพิ่มขีด จำกัด หน่วยความจำนี้

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

การเรียกใช้ Composer ด้วยsudoไม่ใช่ความคิดที่ดีเนื่องจากจะผสมผสานสิทธิ์ของคุณเข้าด้วยกัน ดูเหมือนว่าคุณกำลังทำงานcomposer updateบนเซิร์ฟเวอร์ซึ่งเป็นแนวทางปฏิบัติที่ไม่ดีเช่นกันเนื่องจากจะทำให้การอ้างอิงที่คำนวณได้ภายใต้การควบคุมเวอร์ชันแตกต่างกันมากขึ้น
Nico Haase

เห็นด้วยกับ @NicoHaase คุณต้องระวังให้มากในการใช้สิ่งนี้! ขอบคุณ.
Naser Nikzad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.