Kích thước bộ nhớ cho phép hết 33554432 byte (đã cố gắng phân bổ 43148176 byte) trong php


279

Thông báo lỗi này đang được trình bày, bất kỳ đề nghị?

Kích thước bộ nhớ cho phép hết 33554432 byte (đã cố gắng phân bổ 43148176 byte) trong php


5
Tăng giới hạn bộ nhớ tối đa của bạn lên 64MB trong tệp php.ini của bạn. Tìm kiếm Google Nhưng tôi có thể hỏi tại sao bạn lại cố gắng phân bổ bộ nhớ đó không? Dòng mã nào nó thất bại tại?

1
Kịch bản làm gì khi thất bại? bạn có thể gửi mã?
Neil Aitken

3
Trông giống như một tập tin txt rất lớn.
macbirdie

10
Thông thường, bạn đọc các tệp có kích thước lớn hoặc tùy ý một dòng tại một thời điểm, ghi đè lên bộ nhớ dòng trước đó với mỗi dòng được đọc. Hoặc bạn có thể chỉ muốn theo đuôi hoặc đứng đầu tệp để nhận các mục mới nhất. Upping phân bổ bộ nhớ của bạn khi tập tin phát triển không phải là câu trả lời.
ekerner

Câu trả lời:


317

Cuối cùng tôi đã tìm thấy câu trả lời:

Chỉ cần thêm dòng dưới đây vào trước dòng bạn gặp lỗi trong tệp của bạn

ini_set('memory_limit', '-1');

Nó sẽ sử dụng bộ nhớ không giới hạn của máy chủ, nó hoạt động tốt.

Cảm ơn đã cho bạn bè gợi ý.


125
Bạn vẫn nên kiểm tra tại sao bộ nhớ cạn kiệt. Có lẽ bạn không cần phải đọc toàn bộ tập tin, có thể đọc nó một cách tuần tự.
macbirdie

8
- @panidarapu và @Don Jones: Tùy thuộc vào dung lượng bộ nhớ và cách sử dụng tập lệnh này, có thể nguy hiểm khi cho phép thay đổi cách sử dụng bộ nhớ theo cách này. Don, trong trường hợp của bạn, bạn có thể chia thức ăn thành các phần nhỏ hơn và phân tích những gì bạn cần. Vui mừng nó hoạt động, nhưng hãy cẩn thận.
kẻ hèn nhát ẩn danh

5
Đề nghị này làm việc cho tôi. Tự động tăng giới hạn bộ nhớ trong tập lệnh được thực hiện thông qua hàm ini_set (): ini_set ('memory_limit', '128M');
mente

37
Các bạn, xin đừng đi sửa chữa nhanh chóng này. Nó có thể làm tổn thương bạn về lâu dài. Là một lập trình viên giỏi, bạn nên tìm ra lý do đằng sau mức tiêu thụ bộ nhớ này và tăng theo yêu cầu thay vì giữ nó UNLIMITED.
Sumoanand

113
Wow, câu trả lời ồ ạt này có vẻ như thực sự tồi tệ đối với tôi. -1!
Ambidex

59

Dưới đây là hai phương pháp đơn giản để tăng giới hạn lưu trữ được chia sẻ:

  1. Nếu bạn có quyền truy cập vào tệp PHP.ini, hãy thay đổi dòng trong PHP.ini Nếu dòng của bạn hiển thị 32M, hãy thử 64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Nếu bạn không có quyền truy cập vào PHP.ini, hãy thử thêm tệp này vào tệp .htaccess: php_value memory_limit 64M


47

Kịch bản của bạn đang sử dụng quá nhiều bộ nhớ. Điều này thường có thể xảy ra trong PHP nếu bạn có một vòng lặp đã hết kiểm soát và bạn đang tạo các đối tượng hoặc thêm vào các mảng trên mỗi lần vượt qua của vòng lặp.

Kiểm tra các vòng lặp vô hạn.

Nếu đó không phải là vấn đề, hãy thử và giúp đỡ PHP bằng cách phá hủy các đối tượng mà bạn đã hoàn thành bằng cách đặt chúng thành null. ví dụ.$OldVar = null;

Kiểm tra mã nơi lỗi thực sự xảy ra là tốt. Bạn có mong đợi rằng dòng đó sẽ được phân bổ một lượng lớn bộ nhớ? Nếu không, hãy thử và tìm ra những gì đã sai ...


3
Tôi đã có vấn đề chính xác này - hóa ra tôi đã vô tình tạo ra một hàm đệ quy - và do đó nó hết bộ nhớ bất cứ lúc nào trong quá trình thực thi mã. Điều này có mặt trái của tôi bây giờ có mã hiệu quả bộ nhớ nhất thế giới, được tạo ra trong cuộc săn tìm rò rỉ bộ nhớ.
Kris Selbekk

1
Vì lợi ích của những người khác, họ sẽ đuổi một con thỏ xuống một cái hố. Học thuyết trong Symfony tôi nghĩ có vấn đề với độc thoại và khi có ngoại lệ PDO, nó sẽ tạo ra một vòng lặp ngoại lệ vô hạn vì nó sẽ thử một ngoại lệ cho ngoại lệ do đó che giấu vấn đề thực sự (một tệp db bị hỏng trong trường hợp của tôi).
Desislav Kamenov

39

Đang làm :

ini_set('memory_limit', '-1');

không bao giờ là tốt Nếu bạn muốn đọc một tệp rất lớn, cách tốt nhất là sao chép từng chút một. Hãy thử mã sau đây để thực hành tốt nhất.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;

6
Không thể tin tất cả những người này khuyên bạn nên đặt memory_limit thành -1 ... Điều điên rồ phải làm trên máy chủ sản xuất. Cảm ơn cho một giải pháp sạch hơn nhiều.
JohnWolf

2
Trong khi ở "thực hành tốt nhất", tốt nhất là đóng trình xử lý tệp sau whilevòng lặp:fclose($file)
kodeart

2
@assetCorp Điều này giúp ích như thế nào, miễn là tệp có giới hạn bộ nhớ 100MiB và PHP vẫn được đặt thành 32 MiB. Bạn đọc nó bằng các đoạn bảo mật 1MiB, nhưng sau đó nối nó vào một biến sẽ sử dụng tất cả bộ nhớ khả dụng khi vòng lặp đạt 31. lặp lại. Làm thế nào là tốt hơn? Chỉ xuất ra các khối tương tự không yêu cầu lưu trữ tất cả chúng trong một biến sẽ giúp giải quyết vấn đề.
trực thăng

17

Thật không may, dễ dàng lập trình trong PHP theo cách tiêu thụ bộ nhớ nhanh hơn bạn nghĩ. Sao chép chuỗi, mảng và đối tượng thay vì sử dụng tài liệu tham khảo sẽ làm điều đó, mặc dù PHP 5 được cho là thực hiện việc này tự động hơn so với PHP 4. Nhưng việc xử lý toàn bộ dữ liệu của bạn qua nhiều bước cũng lãng phí so với xử lý đơn vị logic nhỏ nhất tại một thời điểm. Ví dụ cổ điển đang làm việc với các tập kết quả lớn từ cơ sở dữ liệu: hầu hết các lập trình viên tìm nạp toàn bộ tập kết quả vào một mảng và sau đó lặp lại một hoặc nhiều lần với nó foreach(). Việc sử dụng một while()vòng lặp để tìm nạp và xử lý một hàng tại một thời điểm sẽ hiệu quả hơn nhiều . Điều tương tự áp dụng để xử lý một tập tin.


Có vẻ như rất có thể đây là những gì nó làm.
Kzqai

13

Nếu bạn muốn đọc các tệp lớn, bạn nên đọc chúng từng chút một thay vì đọc chúng cùng một lúc.
Đó là phép toán đơn giản: Nếu bạn đọc một tệp lớn 1 MB cùng một lúc, thì cần ít nhất 1 MB bộ nhớ để giữ dữ liệu.

Vì vậy, bạn nên đọc chúng từng chút một bằng cách sử dụng fopen& fread.


1
Giải quyết điều này bằng cách sử dụng:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack

12

Tôi đã gặp vấn đề tương tự trong php7.2 với laravel 5.6. Tôi chỉ tăng số lượng biến memory_limit = 128Mtrong php.ini theo yêu cầu ứng dụng của tôi. Nó có thể là 256M / 512M / 1048M ..... Bây giờ nó hoạt động tốt.


6

Tôi cũng gặp vấn đề tương tự, tìm kiếm các tập tin phpinfo.ini, php.ini hoặc .htaccess không có kết quả. Cuối cùng tôi đã xem xét một số tệp php, mở chúng và kiểm tra mã bên trong bộ nhớ. Cuối cùng, giải pháp này là những gì tôi đưa ra và nó hiệu quả với tôi. Tôi đã sử dụng wordpress, vì vậy giải pháp này có thể chỉ hoạt động đối với vấn đề giới hạn kích thước bộ nhớ wordpress. Giải pháp của tôi, mở tệp default-constants.php trong thư mục / public_html / wp-gộp . Mở tệp đó bằng trình chỉnh sửa mã và tìm cài đặt bộ nhớ trong wp_initial_constantsphạm vi hoặc chỉ Ctrl + F để tìm từ "bộ nhớ". Ở đó bạn sẽ đến WP_MEMORY_LIMITWP_MAX_MEMORY_LIMIT. Chỉ cần tăng nó, nó là 64 MB trong trường hợp của tôi, tôi đã tăng nó lên 128 MB và sau đó lên 200 MB.

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Btw, xin vui lòng không làm mã sau đây, vì đó là thực tế xấu:

ini_set('memory_limit', '-1');

1
Hoạt động cho các trang web wordpress, nơi truy cập không có sẵn cho các tệp .htaccess và php.ini. +1
Mustafa sabir

Tôi muốn nói rằng việc thay đổi các giới hạn đó trên tệp WordPress 'lõi' không thực sự là một ý tưởng hay; wp-config.phpthay vào đó, bạn có thể dễ dàng thêm các giới hạn đó vào đó, nơi chúng sẽ không bị ghi đè bởi các bản cập nhật WordPress trong tương lai. Ngoài ra, một vài plugin bảo mật (chẳng hạn như WordFence) sẽ khiếu nại nếu các tệp WordPress của 'lõi' bị thay đổi ...
Gwyneth Llewelyn

1
@GwynethLlewelyn Tôi không biết làm thế nào, bạn có thể giải thích nó không?
garakchy

1
Ồ ... chỉ cần chỉnh sửa wp-config.phpvà thêm hai dòng ở đó (tức là define( 'WP_MEMORY_LIMIT', '200M' );define( 'WP_MAX_MEMORY_LIMIT', '256M' );không giống như các tệp trên WP 'lõi' (cụ thể là mọi thứ bên dưới wp-includes), sẽ bị ghi đè bởi các nâng cấp WP, wp-config.phpsẽ không - chính xác là nó dành cho mục đích chính xác của việc ghi đè các hằng số WP!
Gwyneth Llewelyn

1
"Thực hành xấu" là tình huống. -1là tốt cho các quá trình chạy ngắn. Ví dụ: bộ chứa trình tạo php được sử dụng để chạy thử nghiệm đơn vị hoặc cài đặt trình soạn thảo / v.v. Chỉ cần không chạy trang web sản xuất của bạn với nó được thiết lập như thế.
emmdee

5

Bạn có thể tăng bộ nhớ cho phép tập lệnh php bằng cách thực thi dòng sau trên tất cả các mã trong tập lệnh:

ini_set('memory_limit','-1'); // enabled the full memory available.

Và cũng phân bổ các biến không mong muốn trong tập lệnh.

Kiểm tra thư viện php này: Giải phóng bộ nhớ với PHP



3

Tôi nhận thấy nhiều câu trả lời chỉ cố gắng tăng dung lượng bộ nhớ được cung cấp cho một tập lệnh có vị trí của nó nhưng thường xuyên hơn không có nghĩa là một cái gì đó quá tự do với bộ nhớ do khối lượng hoặc kích thước không được tăng cường. Rõ ràng nếu bạn không phải là tác giả của một kịch bản, bạn sẽ cảm thấy xót xa cho tác giả trừ khi bạn cảm thấy có tham vọng :) Các tài liệu PHP thậm chí còn nói rằng các vấn đề về bộ nhớ là do " các kịch bản được viết kém "

Cần phải đề cập rằng ini_set('memory_limit', '-1');(không có giới hạn) có thể gây mất ổn định máy chủ như 0 bytes free = bad things. Thay vào đó, hãy tìm sự cân bằng hợp lý bằng những gì tập lệnh của bạn đang cố gắng thực hiện và dung lượng bộ nhớ khả dụng trên máy.

Cách tiếp cận tốt hơn: Nếu bạn là tác giả của kịch bản (hoặc tham vọng), bạn có thể gỡ lỗi các vấn đề bộ nhớ như vậy với xdebug . Phiên bản mới nhất (2.6.0 - phát hành 2018-01-29) đã mang lại cấu hình bộ nhớ cho bạn biết các cuộc gọi chức năng nào đang tiêu thụ một lượng lớn bộ nhớ. Nó phơi bày các vấn đề trong kịch bản mà khó tìm thấy. Thông thường, sự thiếu hiệu quả nằm trong một vòng lặp không mong đợi âm lượng mà nó nhận được, nhưng mỗi trường hợp sẽ được để lại như một bài tập cho người đọc :)

Các tài liệu Xdebug là hữu ích, nhưng nó nắm tới 3 bước sau:

  1. Cài đặt nó - Có sẵn thông qua apt-getyumvv
  2. Định cấu hình nó - xdebug.ini : xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Xem hồ sơ trong một công cụ như QCacheGrind , KCacheGrind

2

Nếu bạn đang cố đọc một tệp, nó sẽ chiếm bộ nhớ trong PHP. Chẳng hạn, nếu bạn đang cố mở và đọc một tệp MP3 (như, nói, $ data = file (" http://mydomain.com/path/sample.mp3 "), nó sẽ kéo tất cả vào bộ nhớ .

Như Nelson gợi ý, bạn có thể làm việc để tăng giới hạn bộ nhớ tối đa nếu bạn thực sự cần sử dụng nhiều bộ nhớ này.


2

Chúng tôi đã có một tình huống tương tự và chúng tôi đã thử đưa ra ở đầu câu trả lời ini_set ('memory_limit', '-1'); và mọi thứ đều hoạt động tốt, các tệp hình ảnh nén lớn hơn 1MB đến KB.


1

Viết

ini_set('memory_limit', '-1');

trong tệp index.php của bạn ở đầu sau khi mở thẻ php


1

Tôi đã nhận được thông báo lỗi tương tự sau khi chuyển sang một chủ đề mới trong Wordpress. PHP đã chạy phiên bản 5.3 nên tôi chuyển sang 7.2. Điều đó đã khắc phục vấn đề.


1

Nếu bạn đang sử dụng một lưu trữ được chia sẻ, bạn sẽ không thể thực thi gia tăng trong giới hạn kích thước php.

Chỉ cần truy cập cpanel của bạn và nâng cấp phiên bản php của bạn lên 7.1 trở lên thì bạn đã sẵn sàng.


0

người dùng wordpress thêm dòng:

@ini_set('memory_limit', '-1');

trong wp-settings.php mà bạn có thể tìm thấy trong thư mục gốc đã cài đặt wordpress


0

Tôi đã không gia hạn lưu trữ của mình và cơ sở dữ liệu chỉ đọc. Joomla cần thiết để viết phiên và không thể làm điều đó.


0

Tôi đã có cùng một vấn đề chạy php trong dòng lệnh. Gần đây, tôi đã thay đổi tệp php.ini và đã xảy ra lỗi khi thay đổi php.ini

Đây là cho php7.0

đường dẫn đến php.ini nơi tôi đã mắc lỗi: /etc/php/7.0/cli/php.ini

Tôi đã đặt memory_limit = 256(có nghĩa là 256 bytes)
thay vì memory_limit = 256M(có nghĩa là 256 Mega bytes).

; Dung lượng bộ nhớ tối đa mà tập lệnh có thể tiêu thụ (128MB)
; http://php.net/memory-limit
memory_limit = 128M

Khi tôi sửa nó, quy trình của tôi bắt đầu chạy tốt.


0

Chạy lệnh này trong thư mục gốc Magento của bạn php -d memory_limit=4G bin/magento


-1

Nếu bạn đang sử dụng laravel thì hãy sử dụng những cách này

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

thay vì

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

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.