Hướng dẫn php catch memory exhausted error - php bắt lỗi hết bộ nhớ

Như câu trả lời này cho thấy, bạn có thể sử dụng register_shutdown_function() để đăng ký một cuộc gọi lại sẽ kiểm tra error_get_last().

Bạn vẫn sẽ phải quản lý đầu ra được tạo từ mã vi phạm, cho dù bởi toán tử @ (Shut Up) hoặc ini_set('display_errors', false)

ini_set('display_errors', false);

error_reporting(-1);

set_error_handler(function($code, $string, $file, $line){
        throw new ErrorException($string, null, $code, $file, $line);
    });

register_shutdown_function(function(){
        $error = error_get_last();
        if(null !== $error)
        {
            echo 'Caught at shutdown';
        }
    });

try
{
    while(true)
    {
        $data .= str_repeat('#', PHP_INT_MAX);
    }
}
catch(\Exception $exception)
{
    echo 'Caught in try/catch';
}

Khi chạy, điều này xuất ra Caught at shutdown. Thật không may, đối tượng ngoại lệ ErrorException không bị ném vì lỗi nghiêm trọng kích hoạt kết thúc tập lệnh, sau đó chỉ bị bắt trong chức năng tắt máy.

Bạn có thể kiểm tra mảng $error trong chức năng tắt để biết chi tiết về nguyên nhân và trả lời phù hợp. Một đề xuất có thể được đưa lại yêu cầu trở lại đối với ứng dụng web của bạn (tại một địa chỉ khác hoặc với các tham số khác nhau tất nhiên) và trả về phản hồi đã bị bắt.

Mặc dù vậy, tôi khuyên bạn nên giữ

0 cao (giá trị
1) và sử dụng (như những người khác đã đề xuất) xử lý lỗi cho mọi thứ khác với
2 và ErrorException.

1 Giới thiệu: Tại sao lỗi gây tử vong xảy ra?

Các lỗi ngoài bộ nhớ là một trong những vấn đề phổ biến và khó sửa chữa nhất mà các nhà phát triển PHP gặp phải-đặc biệt là với các ứng dụng xử lý một lượng lớn dữ liệu-nhờ cài đặt bộ nhớ mặc định tương đối bảo thủ của PHP. Trên thực tế, có hơn 1.300 câu hỏi liên quan đến lỗi bộ nhớ PHP chỉ trên Stack Overflow.

98% thời gian lỗi này xuất phát từ việc tải nhiều hơn vào bộ nhớ so với những gì bạn thiết lập PHP để xử lý trong một quy trình. Có những nguyên nhân khác, nhưng những nguyên nhân này ít phổ biến hơn nhiều - rất hiếm khi nó có thể là rò rỉ bộ nhớ nếu bạn đang ở trên Php 5.3 trở lên. this error comes from loading more into memory than what you set up PHP to handle in one process. There are other causes, but these are much less common — very rarely it can be a memory leak if you're on PHP 5.3 and above.

Nếu bạn không chắc chắn giới hạn bộ nhớ PHP của bạn được đặt thành gì, thì nó sẽ được đưa vào một cách hữu ích trong thông báo lỗi. Tuy nhiên, kích thước được báo cáo bằng byte, vì vậy chúng tôi đã thực hiện một số chuyển đổi cho bạn:

  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 8388608 byte cạn kiệt - 8 MB8388608 Bytes Exhausted - 8 MB
  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 16777216 byte cạn kiệt - 16 MB16777216 Bytes Exhausted - 16 MB
  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 33554432 byte cạn kiệt - 32 MB33554432 Bytes Exhausted - 32 MB
  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 67108864 byte cạn kiệt - 64 MB67108864 Bytes Exhausted - 64 MB
  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 134217728 Byte cạn kiệt - 128 MB134217728 Bytes Exhausted - 128 MB
  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 268435456 Byte cạn kiệt - 256 MB268435456 Bytes Exhausted - 256 MB
  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 536870912 byte cạn kiệt - 512 MB536870912 Bytes Exhausted - 512 MB
  • PHP: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 1073741824 byte cạn kiệt - 1 GB1073741824 Bytes Exhausted - 1 GB

2 Tôi phải làm gì để giải quyết nó?

Hành động đầu tiên của bạn là tăng giới hạn bộ nhớ của bạn. Lưu ý, đây là một sản xuất gỡ lỗi tạm thời. Mục tiêu là tăng bộ nhớ lên một điểm mà chúng tôi có ứng dụng hoạt động trở lại với mục đích sau đó giảm sử dụng bộ nhớ. Khi bạn giảm việc sử dụng bộ nhớ, bạn có thể giảm bộ nhớ giới hạn nó xuống một giá trị phù hợp hơn. Kế hoạch của bạn nên sử dụng ít bộ nhớ mà bạn thực tế có thể sử dụng nơi ứng dụng hoạt động và chức năng chính xác trong máy chủ sản xuất dựa trên khối lượng công việc của người dùng của bạn (con người hoặc lập trình). Tôi thường khuyên bạn nên đặt giới hạn bộ nhớ thành một thứ gì đó cao, như 1GB, giả sử bạn có ít nhất 150% số tiền miễn phí trong RAM.first course of action is to increase your memory limit. Note, this is a temporary debugging producedure. The goal is to increase the memory to a point where we have the application working again for the purpose of then reducing the memory usage. Once you decrease the memory usage you can lower the memory limit it to a value that's more suitable. Your plan should be to use as little memory as you could practically use where the application works and functions correctly in a production server based on the workload by your users (humans or programmatic). I usually recommend setting the memory limit to something high, like 1GB, assuming you have at least 150% of that free in RAM.

Ngoài ra, không bao giờ thực hiện các thử nghiệm này trên máy chủ sản xuất trừ khi bạn chắc chắn rằng bạn có nhiều RAM và bạn hoàn toàn hiểu cách xử lý máy chủ web tiêu thụ bộ nhớ. Bạn có thể dễ dàng mang một máy chủ đến đầu gối của nó nếu có nhiều quy trình đồng thời chạy, mỗi quy trình sử dụng một lượng bộ nhớ cao. Tôi sẽ không bao giờ, bao giờ khuyên bạn nên đặt giới hạn bộ nhớ thành

1 (không giới hạn) trong môi trường sản xuất. Đó là một công thức cho thảm họa. Đừng phạm sai lầm mới.never do these tests on a production server unless you're sure you have plenty of RAM and you fully understand how web server processes consume memory. You could easily bring a server to its knees if there are many concurrent processes running, each using a high amount of memory. I would never, ever recommend setting the memory limit to
1 (unlimited) in a production environment. That's a recipe for disaster. Don't make that newbie mistake.

Vì vậy, làm thế nào để bạn làm điều này? Đơn giản - Tăng giới hạn bộ nhớ được lập trình sớm trong mã của bạn, trước khi quá trình của bạn hết bộ nhớ. Nếu bạn làm theo cách này, bạn chỉ có thể cung cấp bộ nhớ thêm PHP khi đoạn mã đó được gọi là thay vì tăng giới hạn bộ nhớ cho tất cả các quy trình PHP.

  • Nếu bằng cách tăng giới hạn bộ nhớ, bạn đã thoát khỏi lỗi và mã của bạn hiện hoạt động, bạn sẽ cần thực hiện các biện pháp để giảm việc sử dụng bộ nhớ đó. Dưới đây là một vài điều bạn có thể làm để giảm nó:
  • Nếu bạn đang đọc các tệp, hãy đọc chúng theo từng dòng thay vì đọc trong tệp hoàn chỉnh vào bộ nhớ. Nhìn vào
    5 và
    6.
  • Nâng cấp lên phiên bản mới của PHP nếu bạn đang sử dụng PHP 5.3. Php 5.4 và 5.5 sử dụng bộ nhớ ít hơn nhiều.
  • Tránh tải các bộ dữ liệu lớn vào một mảng. Thay vào đó, hãy xử lý các tập hợp nhỏ hơn của bộ dữ liệu lớn hơn và, nếu cần, vẫn tồn tại dữ liệu của bạn vào cơ sở dữ liệu để giảm sử dụng bộ nhớ.
  • Hãy thử phiên bản mới nhất hoặc phiên bản nhỏ của thư viện của bên thứ ba (ví dụ 1.9.3 so với 1.8.2 của bạn) và sử dụng bất kỳ nào ổn định hơn. Đôi khi các phiên bản mới hơn của thư viện được viết hiệu quả hơn.
  • Nếu bạn có tiện ích mở rộng PHP không phổ biến hoặc không ổn định, hãy thử nâng cấp nó. Nó có thể bị rò rỉ bộ nhớ.
  • Nếu bạn đang xử lý các tệp lớn và bạn chỉ đơn giản là không thể đọc từng dòng, hãy thử chia tệp thành nhiều tệp nhỏ hơn và xử lý riêng lẻ.
  • Tắt các tiện ích mở rộng PHP mà bạn không cần.
  • Trong khu vực có vấn đề, các biến số không đặt có chứa một lượng lớn dữ liệu và không cần thiết sau này trong mã.

2.1 đã làm mọi thứ, đặt nó thành không giới hạn và vẫn gặp lỗi

Gọi cho ER, bởi vì có lẽ bạn sẽ kết thúc ở đó. Không, nghiêm túc, đây là một vài điều bạn có thể làm.

Đầu tiên, bạn cần tự hỏi mình khi điều này bắt đầu xảy ra. Nó có hoạt động trước đây không, và bây giờ nó không? Nếu vậy, hãy nghĩ về những gì có thể đã thay đổi. Cô lập vấn đề.

Có lẽ bạn đã không chạm vào mã của mình trước khi sự cố xuất hiện. Vâng, những gì khác có thể đã thay đổi? Có sự phụ thuộc bên ngoài không? Có lẽ một cơ sở dữ liệu, hoặc các tệp được nhập bởi người dùng? Đặt điều đó vào danh sách nghi phạm của bạn và bắt đầu điều tra.

Bắt đầu nhỏ; Bắt đầu với những gì bạn "nghĩ rằng" vấn đề là và cố gắng chứng minh bản thân sai. Nếu bạn không thể, hãy chuyển sang nghi phạm tiếp theo. Xem bạn đi bao xa trong mã của mình trước khi nó thoát sớm, sau đó bắt đầu thực hiện ngăn xếp cuộc gọi từ đó (

7 nếu bạn chưa cài đặt XDebug). Nếu bạn có thể gỡ lỗi tương tác với trình gỡ lỗi XDebug hoặc Zend, hãy thực hiện điều đó và đặt một điểm dừng ngay trước khu vực có vấn đề.

Tôi đã từng gặp vấn đề trong đó một tệp Excel tiếp tục hết bộ nhớ sau khi được nhập. Nó đã hoạt động tốt trong nhiều tháng, nhưng đột nhiên dừng lại. Tôi nghĩ rằng tôi đã mất ít nhất 5 giờ gỡ lỗi không ngừng trước khi tôi phát hiện ra vấn đề: dữ liệu ngẫu nhiên bằng cách nào đó đã được người dùng chèn vào một trong những ô của bảng tính. Rõ ràng PHP vừa mới đi haywire, và tôi vẫn chưa phát hiện ra nguyên nhân gốc rễ, mặc dù biết kích hoạt.

Tôi đã có thể tiết kiệm rất nhiều thời gian bằng cách tự hỏi mình đã thay đổi điều gì. Câu trả lời rất rõ ràng - đầu vào dữ liệu của người dùng và cơ sở dữ liệu. Bạn có thể có một kinh nghiệm tương tự.

3 xdebug, con dao quân đội Thụy Sĩ

Trong mọi tình huống, có một công cụ bạn có thể tin tưởng để giúp chẩn đoán số lượng bộ nhớ bạn đang sử dụng và nơi trong mã của bạn, một lượng lớn bộ nhớ đang được sử dụng: XDebug. Bạn có thể cài đặt nó bằng các trình quản lý gói như

8,
9,
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
0 và
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
1; cài đặt một nhị phân được xây dựng sẵn; sử dụng
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
2; Hoặc đơn giản là tự biên dịch nó.

Sau khi cài đặt XDebug, tất cả những gì bạn cần làm là làm mới trang hoặc, nếu mã của bạn có nghĩa là chạy trong vỏ, hãy chạy lại nó trong CLI. PHP bây giờ sẽ ném nhiều lỗi nhiều thông tin hơn, bao gồm một ngăn xếp cuộc gọi sẽ cho bạn biết chính xác nơi tập lệnh dừng với đường dẫn tệp, số dòng và thậm chí hàm cuối cùng được gọi.

Nếu bạn muốn có thông tin chi tiết hơn, bạn sẽ cần tạo ra cái gọi là "tệp theo dõi". Để thực hiện việc này, hãy đặt các chỉ thị cấu hình

startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
3 và ____24 thành
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
5. Các tệp theo dõi thường được lưu trong
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
6 hoặc
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
7, nhưng bạn có thể kiểm tra đường dẫn đầu ra bằng cách xem xét chỉ thị
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
8 trong
startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
9.

Chỉ cần chạy mã và tệp theo dõi - bao gồm cả việc sử dụng bộ nhớ - sẽ được tạo ngay cả khi bạn hết bộ nhớ sớm.

Để xác định vấn đề, bắt đầu ở dưới cùng của tệp theo dõi và làm việc theo cách của bạn. Tìm Deltas (số có + hoặc -) với một số lượng lớn và hãy nhớ rằng chúng được hiển thị bằng byte. 1024 byte = 1 kilobyte.

Sau khi gỡ lỗi gỡ lỗi, hãy đảm bảo đặt lại

startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );
3 thành register_shutdown_function()1. Các tập tin theo dõi có thể trở nên rất lớn, rất nhanh và ăn không gian đĩa.

Quản lý bộ nhớ 4 PHP

Đây là một sàn trượt tuyệt vời về cách PHP đối phó với bộ nhớ trong nội bộ.

5 Thử thách

Sử dụng tập lệnh sau và cố gắng xác định chính xác vấn đề ở đâu. Thậm chí tốt hơn, cài đặt XDebug và tạo tệp theo dõi.

startTime = microtime(true);
    }

    function timerEnd(){
        echo number_format( (microtime(true) - $this->startTime)*1000, 2 ), ' ms';
    }
}

class ProfilerHolder {
    protected $profiler;

    public function __construct( Profiler $profiler ){
        $this->profiler = $profiler;
    }
}

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

$profiler = new Profiler();

$profiler->timerStart();

get_usage_in_kb();

$holder = new ProfilerHolder( $profiler );

$b = null;

/**
 * @return string
 */
function make_dummy_data()
{
    return str_repeat( "Hello|", 114242 );
}

$a = make_dummy_data();

$data = explode( '|', $a ); // comment this after narrowing down that a lot of memory is being used here
//$data = array(); // uncomment this and memory usage will drop

$buffer = array();

foreach( $data as $key => $item ){
    $buffer[] = $item;
}

get_usage_in_kb();

unset($a);

get_usage_in_kb();

echo memory_get_peak_usage(TRUE)/1024, ' kb', "\n";

$profiler->timerEnd();

unset( $profiler );
xdebug_debug_zval( 'profiler' );

//var_dump( $holder );

Với tất cả các mẹo này trong tâm trí, bạn sẽ có thể khắc phục bất kỳ lỗi cạn kiệt bộ nhớ nào. Nếu bạn vẫn đang gặp sự cố, tôi rất vui khi được nhảy vào một phiên AirPair và giúp đi đến gốc rễ của vấn đề để bạn có thể tập trung vào những gì quan trọng.

Làm cách nào để khắc phục kích thước bộ nhớ cạn kiệt?

Resolution..
Đăng nhập vào cPanel. ....
Trong phần Phần mềm/Dịch vụ của Màn hình chính CPanel, bấm chọn Phiên bản PHP:.
Nhấp vào Chuyển sang Cài đặt PHP ..
Xác định vị trí hàng Memory_Limit, chọn giá trị mới cho giới hạn bộ nhớ tập lệnh, sau đó nhấp vào Áp dụng ..
Nhấp vào Lưu để lưu cài đặt ..

Làm cách nào để sửa lỗi bộ nhớ trong PHP?

Tạo tệp phpinfo.php trong thư mục gốc và kiểm tra các giới hạn bộ nhớ hiện tại. Theo giới hạn bộ nhớ mặc định là 8m, nhưng trong trường hợp này, bạn phải tăng giới hạn bộ nhớ lên 12m, 16m, 24m, v.v. với dòng này. Điều này sẽ tăng giới hạn bộ nhớ của bạn và giải quyết lỗi này. php file under root directory and check for current memory limits. By default memory limit is 8M, but in this case you have to increase the memory limits to 12M, 16M, 24M and so on with this line. This will increase your memory limit and solve this error.

Làm cách nào để khắc phục kích thước bộ nhớ được phép 134217728 byte cạn kiệt?

Cách chính xác là chỉnh sửa tệp php.ini của bạn.edit memory_limit theo giá trị mong muốn của bạn.Từ câu hỏi của bạn, 128m (là giới hạn mặc định) đã bị vượt quá, do đó, có một cái gì đó sai nghiêm trọng với mã của bạn vì nó không nên mất nhiều như vậy.edit your php. ini file. Edit memory_limit to your desire value. As from your question, 128M (which is the default limit) has been exceeded, so there is something seriously wrong with your code as it should not take that much.

Làm cách nào để sửa lỗi cho phép Fatal Fatal cho phép Kích thước bộ nhớ 8388608 đã cạn kiệt?

23 bình luận..
Thêm ini_set (Memory Memory_Limit ,, 16m,);Để bắt đầu tệp PHP riêng lẻ của bạn gây ra lỗi.Ví dụ, nếu chỉ mục.PHP đang gây ra lỗi, thêm vào đầu chỉ mục.....
Thay đổi bộ nhớ_limit = dòng trong PHP của bạn.Tệp INI.....
Thêm dòng memory_limit = dòng vào của bạn.Tệp HTAccess (hoặc tạo A ..