Cập nhật Trình soạn thảo PHP không thể phân bổ lỗi bộ nhớ (sử dụng Laravel 4)


168

Tôi không thể giải quyết cái này.

Tôi đang sử dụng gói cơ bản Linode 1G RAM. Cố gắng cài đặt một gói thông qua Trình soạn thảo và nó không cho phép tôi. Giới hạn bộ nhớ của tôi được đặt thành "-1" trên PHP.ini

Tôi có thể làm gì khác để cài đặt cái này không?

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

Câu trả lời:


96

Một chút cũ nhưng chỉ trong trường hợp ai đó mới đang tìm giải pháp, cập nhật phiên bản PHP của bạn có thể khắc phục vấn đề.

Ngoài ra, bạn nên cam kết tệp composer.lock của mình và thực hiện cài đặt trình soạn thảo trên môi trường sản xuất ít tốn tài nguyên hơn.

Thêm chi tiết tại đây: https://github.com/composer/composer/issues/1898#issuecomment-23453850


12
XUẤT SẮC! Điều đó đã làm việc. Tôi đã không nâng cấp PHP của mình, nhưng cam kết tệp composer.lock và cập nhật cài đặt tất cả mọi thứ đúng cách. Cảm ơn bạn.
ericbae

6
Đến bữa tiệc muộn, nhưng tôi đơn giản là tắt Apache và MySQL. Có một lý do tôi đang sử dụng VPS RAM 512 MB, không muốn tiêu tiền.
Kumar

11
Cập nhật PHP không phải là một giải pháp. Tôi có 7.0.21 và vẫn gặp lỗi này.
cj5

@ Giải pháp của Kumar làm việc cho tôi. Siêu dễ và giống như hầu hết mọi thứ, hiển nhiên trong nhận thức muộn màng :)
James Bridgewater

Cảm ơn rất nhiều. Tiết kiệm cho tôi một loạt thời gian.
Jay Geeth

404

Có vẻ như bạn hết bộ nhớ trao đổi, hãy thử điều này

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

như được đề cập bởi @ BlackBurn027 về các bình luận bên dưới, giải pháp này đã được mô tả ở đây


27
Thưa bạn, là một thiên tài - nó không phải là vấn đề về php và việc xóa các tệp sẽ không giúp ích gì. Tôi phải làm theo hướng dẫn của bạn (với sudo) trên VPS của tôi. Đây là câu trả lời hữu ích duy nhất ở đây cho chủ sở hữu VPS.
Croll

4
getcomposer.org/doc/articles/ giết như được đề cập bởi nguồn
BlackBurn027

1
Điều này làm việc cho tôi nhưng tôi bối rối không biết những lệnh đó đang làm gì, ai đó có thể giải thích chúng không?
Joseph Astrahan

2
đôi khi 1024 là không đủ ... Thay vào đó hãy sử dụng 2048
psylosss

1
@JaberAlNahian bạn có thể thực hiện trao đổi vĩnh viễn, vui lòng kiểm tra tại đây digitalocean.com/community/tutorials/ mẹo
Mohammed Omer

78

Như hướng dẫn xử lý sự cố của nhà soạn nhạc ở đây Điều này có thể xảy ra do VPS hết bộ nhớ và không có không gian Hoán đổi được kích hoạt.

free -m

Để kích hoạt trao đổi, bạn có thể sử dụng ví dụ:

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

Hoặc nếu ở trên không hoạt động thì bạn có thể thử tạo một tệp hoán đổi

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

cảm ơn rất nhiều mà không cần nâng cấp php5 lên php7, điều này đã hoạt động
Shadab K

Bạn phải chạy nó trên CLI của Linux
Umair Hamid

Nó đã báo lỗi một lần nữa nhưng chạy cập nhật trình soạn thảo sau đó đã hoạt động tốt.
Amir Hajiha

Và bạn có thể kiểm tra [tài liệu chính thức] [2] getcomposer.org/doc/articles/ Khăn
Thilina Dharmasena

38

Tôi đã phải đối mặt với cùng một vấn đề. Tôi đang sử dụng Microinstance miễn phí AWS có ít bộ nhớ hơn. Tôi luôn thử một trong các tùy chọn bên dưới và nó luôn hoạt động (Trước khi tất cả điều này, vui lòng kiểm tra xem bạn đã cài đặt phiên bản mới nhất của nhà soạn nhạc chưa)

sudo php -dmemory_limit=750M composer.phar update

hoặc xóa nội dung của thư mục nhà cung cấp và thử cập nhật trình soạn thảo.

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

Tùy chọn thứ hai cố gắng cập nhật tất cả các thành phần, nếu không có bản cập nhật, nó sẽ chọn gói từ bộ đệm khác lấy từ dist

Lưu ý: Vui lòng thay đổi giới hạn bộ nhớ theo lựa chọn của bạn.

hoặc là

Tạo phân vùng trao đổi và thử. Phân vùng hoán đổi là một phần của ổ cứng mà linux sử dụng làm bộ nhớ ảo khi hết bộ nhớ vật lý. Nó tương tự như tệp hoán đổi windows chỉ thay vì sử dụng một tệp thực tế, linux sử dụng phân vùng trên ổ cứng thay thế.

Hi vọng điêu nay co ich


1
Tôi đã giảm giới hạn bộ nhớ xuống còn 500M và nhà soạn nhạc đã cài đặt những gì tôi cần.
devNiri

bạn cũng có thể sử dụng tệp hoán đổi thực tế thay vì phân vùng. xem cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04

2
Có vấn đề tương tự trên tài khoản Digital Ocean của tôi ngay cả ở 250M Tôi cũng phải dừng Apache và MySQL trước khi tôi có thể chạy nó
tristanbailey

tristanbailey giải pháp của bạn đã làm việc, cảm ơn! Trước khi tôi dừng mysql và apache, tôi không thể cập nhật, thậm chí bằng cách đặt giới hạn bộ nhớ php.
Elias Kouskoumvekakis

Khi tôi chạy, sudo php -dmemory_limit=750M composer.phar update tôi gặp lỗi này, Could not open input file: composer.pharxin hãy giúp đỡ
Varun Naharia

15

Dễ dàng, gõ lệnh này:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Nên làm việc cho máy bộ nhớ thấp


Đã làm cho tôi. Tôi đã viết một câu trả lời toàn diện ở đây - stackoverflow.com/questions/26850332/ trên
halkujabra

Nó không hoạt động. Và điều này đã xóa tất cả thư mục nhà cung cấp của tôi. Nó sai!
Vladimir Kovalchuk

Vấn đề xóa nhà cung cấp là gì? chỉ cần chạy cài đặt / cập nhật lại ...

1
Xóa nhà cung cấp không hoàn toàn sai, mặc dù nó phá vỡ trang web và giữ nó ở trạng thái bị hỏng nếu cài đặt vẫn không hoạt động. Tuy nhiên, không nên xóa tệp khóa trên máy sản xuất. Bạn nên cam kết tập tin khóa của bạn và chỉ cài đặt, không cập nhật. Thực tế, bằng cách xóa tệp khóa, bạn buộc Trình soạn thảo cài đặt từ tệp json, đây là nơi mà các quy trình sử dụng nhiều bộ nhớ đến (xác định phiên bản nào sẽ cài đặt).
Shauna

Bạn có thể làm theo điều này nếu bạn không ở trong môi trường sản xuất, vì nó sẽ phá vỡ dự án cho đến khi nhà soạn nhạc hoàn thành việc cài đặt
Bizarro

11

Dưới đây là các bước để khắc phục sự cố: (phương pháp phân bổ tệp SWAP nhanh tức thì được sử dụng)

Cài đặt máy chủ SWAP (Ubuntu 16.04 SWAP để khắc phục lỗi bộ nhớ)

Kiểm tra xem bạn đã trao đổi chưa, bộ nhớ và kích thước đĩa:

    sudo swapon -s
    free -m
    df -h

Tạo tệp hoán đổi: (thay đổi 1G thành 4G nếu bạn muốn bộ nhớ SWAP 4GB)

    sudo fallocate -l 1G /swapfile 

Kiểm tra tập tin hoán đổi:

    ls -lh /swapfile

Chỉ định tệp hoán đổi:

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

Kiểm tra xem trao đổi OK, bộ nhớ và kích thước đĩa:

    sudo swapon -s
    free -m
    df -h

Đính kèm tập tin hoán đổi khi khởi động lại hệ thống:

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

Điều chỉnh cài đặt tệp hoán đổi:

    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

Ưu tiên tệp SWAP: (0-100% => 0: Không đặt để trao đổi, 100: Đặt SWAP và giải phóng RAM)

        vm.swappiness=10

Xóa inode khỏi bộ đệm: (100: hệ thống xóa thông tin inode khỏi bộ đệm quá nhanh)

        vm.vfs_cache_pressure = 50

Tôi không biết mình phải làm gì ở bước cuối cùng sudo nano /etc/sysctl.conf, vì vậy, tôi bỏ qua nó sau đó khởi động lại Nginx và sau đó làm composer install(trước đây tôi đã xóa thư mục nhà cung cấp) và nó hoạt động. Cảm ơn!
arhakim

10

Tôi đã có một vấn đề tương tự trên vagrant. Tôi đã sửa nó bằng allcate thêm bộ nhớ.

 config.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
 end

1
Giải quyết vấn đề này cho tôi quá. Lưu ý rằng trong 2.x thay vì vb.customize ...bạn có thể làm vb.memory = 1024.
acobster

10

Thử

về cơ bản là tăng bộ nhớ trao đổi

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


6
Vui lòng thêm một số lời giải thích cho câu trả lời của bạn để những người khác có thể học hỏi từ nó.
Nico Haase

Tôi đồng ý rằng điều này sẽ có nhiều lời giải thích hơn, nhưng nó hiệu quả với tôi (về cơ bản là nâng cao bộ nhớ trao đổi). Cảm ơn!
1015214

8

Hãy thử điều đó:

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

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1

1
Vui lòng thêm một số giải thích cho câu trả lời của bạn để người khác có thể học hỏi từ nó - đặc biệt: bạn đã thay đổi gì so với các câu trả lời khác sử dụng cùng một phương pháp? Có cần phải lặp lại câu trả lời của họ?
Nico Haase

7

Đây là cách giải quyết mà tôi thấy phù hợp với mình mọi lúc:

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

5
Wowwow, đăng các lệnh mà không giải thích những gì họ làm có lẽ là nguy hiểm! Mặc dù tôi chắc chắn có thể nói rằng nó sẽ hoạt động trên hầu hết các hệ thống. Về cơ bản, bạn đang tạo phân bổ không gian Hoán đổi để HD có thể được sử dụng làm RAM. Dưới đây là hướng dẫn toàn diện về cách thực hiện điều đó giải thích từng lệnh: digitalocean.com/community/tutorials/
mẹo

Cảm ơn bạn đã làm rõ các lệnh, thật tuyệt khi biết kịch bản thực sự làm gì trước khi bạn thực hiện nó. Nhưng theo cách tương tự, thật không hay khi bạn quảng bá đại dương kỹ thuật số và bài viết hướng dẫn / blog của bạn.
Goran

Hướng dẫn là tuyệt vời, hiển thị từng bước với lời giải thích!
Tarik

Cảm ơn bạn! Bạn hướng dẫn giúp tôi cài đặt Drupal Presto cho máy chủ RAM 1GB. Tôi đã thay đổi 1024 thành 2048.
Nikit

7

Tôi đã thử bằng cách xóa thư mục nhà cung cấp và tập tin composer.lock và sau đó tôi chạy lệnh composer clear-cachevà sau đó composer install. Vì vậy, nó làm việc mà không có bất kỳ lỗi.


6

bạn có thể sử dụng cách sau để kiểm tra bộ nhớ (trao đổi) miễn phí

free -m

total used free shared buffers cached

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

Để kích hoạt trao đổi, bạn có thể sử dụng ví dụ:

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

Tôi đã sử dụng free -mvà nhận thấy rằng tôi không có bộ nhớ, thậm chí không trao đổi .. sau đó đã làm sudo rebootvà nó đã hoạt động
Eleazar Resendez

4

Đây dường như là một vấn đề định kỳ với các phiên bản máy chủ 1GB và nhỏ hơn. Ngoài việc cố gắng tắt quá trình và điều chỉnh cài đặt trao đổi, bạn có thể cài đặt trên máy cục bộ và tải lên.


1
Vâng. Điều thú vị là nếu tôi xóa toàn bộ dự án, thực hiện một thao tác git mới và sau đó cài đặt trình soạn thảo, nó dường như hoạt động. Lạ thật.
ericbae

Thật khó chịu, tôi đang triển khai một vài dự án L4 lên các phiên bản Linode 1GB và hiện đang lo lắng về việc tăng trần bộ nhớ.
Makita

Một liên kết cũ nhưng có thể được sử dụng: github.com/composer/composer/issues/1104
Makita

2
Câu trả lời được chấp nhận vẫn là cách tốt nhất để đi. Bạn nên cam kết composer.lock và sau đó chạy cài đặt thay vì cập nhật trên máy chủ sản xuất.
Makita

3

Đôi khi bằng cách tự cập nhật trình soạn thảo, nó giải quyết vấn đề

php composer.phar self-update

Chúc mừng


Đây phải là điều đầu tiên để cố gắng khắc phục vấn đề. Tôi gặp sự cố với 1.3.3, tự cập nhật lên 1.4.0 đã khắc phục sự cố. Mẹo: bạn có thể cập nhật câu trả lời của mình để bao gồm cả trường hợp sử dụng composer self-update, nếu ai đó không quen thuộc với nhà soạn nhạc sẽ đọc câu trả lời này.
Niklaus

xin phép từ chối khi đổi tên xảy ra
Andrew

3

Thử cái này:

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

Công việc này đối với tôi trên Centos 6


điều này đã làm việc với tôi trên AWS Opsworks EC2 Instance Ubuntu 14.04! Cảm ơn!
Paul Preibisch

3

Tôi đã tăng PHP memory_limittừ 128M mặc định lên 512M và khởi động lại máy chủ. Điều đó đã giải quyết vấn đề.


3
không cần khởi động lại vì PHP không chạy như một dịch vụ.
HelpNeeder

1
Không nhưng Apache thì có và do đó nên khởi động lại để có hiệu lực ...
Dediqated

1
nó là cần thiết, vì apache tải các mô-đun php
Aris

2

Tôi thường gặp tình huống này vì vậy thông thường tôi thường làm theo bước thiết lập bộ nhớ trao đổi.

Nhưng bây giờ tôi tìm thấy một mẹo thay thế đơn giản mà hiệu quả với tôi.

Chạy composer update --no-devkhác hơncomposer update


2

Tôi đã giải quyết vấn đề tương tự trong Vagrant. Tôi đã tăng giá trị của memory_limit và xóa bộ đệm của nhà soạn nhạc: sudo rm -R ~ / .composer và cuối cùng là tải lại một cách mơ hồ.


1

có cùng vấn đề với bản cập nhật php composer.phar trên máy chủ lưu trữ 512mb của tôi.

giải quyết với trình soạn thảo php.


1

Thực hiện trao đổi và chạy lệnh tổng hợp lại. Tôi hy vọng nó sẽ làm việc cho bạn.

 $ 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

1

Trong trường hợp của tôi, tôi đã thử mọi thứ được liệt kê ở trên. Tôi đã sử dụng Laravel và Vagrant với 4GB bộ nhớ và trao đổi, với giới hạn bộ nhớ được đặt thành -1. Tôi đã xóa nhà cung cấp / và thử các phiên bản PHP khác. Cuối cùng, tôi quản lý nó để hoạt động bằng cách chạy

vagrant halt
vagrant up

Và sau đó trình soạn thảo cài đặt hoạt động trở lại như bình thường.


0

Tôi gặp vấn đề tương tự trên máy chủ rẻ nhất (512MB RAM) được lưu trữ với DigitalOcean và tôi cũng đang chạy Jenkins CI trên cùng một máy chủ. Sau khi tôi dừng phiên bản Jenkins, lệnh cài đặt của trình soạn thảo đã hoạt động (tốt, đến một điểm, nó đã thất bại với phần mở rộng mcrypt bị thiếu bên cạnh việc đã được cài đặt!).

Có thể nếu bạn có một ứng dụng khác đang chạy trên máy chủ, có lẽ giá trị của nó là cố gắng ngăn chặn nó và chạy lại lệnh.


0

Hãy vô hiệu hóa gói js và tăng bộ nhớ. Điều đó sẽ sửa nó. Tôi đã sửa lỗi của tôi bằng cách vô hiệu hóa gói js.

Cảm ơn


Vui lòng chia sẻ thêm chi tiết về câu trả lời của bạn - tại sao nên tắt trợ giúp "js bundling" khi xảy ra lỗi khi tải xuống gói (điều này xảy ra trước khi bất kỳ tập lệnh nào được chạy)
Nico Haase

-1

chỉnh sửa tệp php.ini và tăng giá trị memory_limit.

memory_limit = 1G

sẽ giải quyết vấn đề này.


-1
composer update

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

> mmap () không thành công: [12] Không thể phân bổ bộ nhớ

Cập nhật bộ nhớ trên Máy chủ và yêu cầu '4G' Thay đổi 4GB Ram [thử thay đổi loại máy chủ hoặc thêm ram]

2 tập tin Chúng tôi cần chỉnh sửa


theo lệnh

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

và chỉnh sửa "memory_limit 756M”thành4G


Php ini trên php 7.0

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

bộ nhớ_limit = 128M đến 4G

#AWS #AMAZONLINEUX # MAGENTO2 # PHP7.0


1
Vui lòng thêm một số lời giải thích cho câu trả lời của bạn. Rốt cuộc thay đổi bất cứ điều gì .htaccesskhông ảnh hưởng composer, vì điều này không chạy qua máy chủ web
Nico Haase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.