Hướng dẫn how do i fix php fatal error allowed memory size 134217728 bytes exhausted? - làm cách nào để sửa lỗi php nghiêm trọng cho phép kích thước bộ nhớ 134217728 byte cạn kiệt?

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.

<?php
    ini_set('memory_limit', '1024M'); // or you could use 1G
  • 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 fgetsSplFileObject::fgets.
  • 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ừ đó (var_dump debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) 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ư yum, apt-get, porthomebrew; cài đặt một nhị phân được xây dựng sẵn; sử dụng

<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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; 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

<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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 và
<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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 thành
<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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. Các tệp theo dõi thường được lưu trong
<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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 );
4 hoặc
<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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, nhưng bạn có thể kiểm tra đường dẫn đầu ra bằng cách xem lệnh
<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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 trong
<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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.

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

<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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 thành
<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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. 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.

<?php
function get_usage_in_kb(){
    echo memory_get_usage()/1024.0 . " kb \n";
}

class Profiler
{
    protected $startTime = 0;
    public function timerStart(){
        $this->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ớ cho phép lỗi nghiêm trọng của PHP?

Bạn có thể tìm thấy tệp php.ini trong public_html cho trang web của bạn và nhấp chuột phải vào tệp để chỉnh sửa nó. Nhìn vào dòng xác định biến Memory_Limit và đặt giá trị phù hợp. Sau đó, lưu các thay đổi và tải lại trang web của bạn để xem liệu Php cho phép kích thước bộ nhớ của lỗi đã cạn kiệt lỗi đã được giải quyết.find the php. ini file in the public_html for your website and right-click on the file to Edit it. Look for the line defining the memory_limit variable and set the value accordingly. Then, save the changes and reload your site to see if the PHP “Allowed Memory Size of Bytes Exhausted” error has been resolved.

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 ..

Làm cách nào để tăng giới hạn bộ nhớ PHP?

Làm thế nào để thay đổi giới hạn bộ nhớ..
Xác định vị trí PHP.Tệp INI được sử dụng bởi máy chủ web của bạn.Bạn có thể nhấp vào liên kết "Thông tin thêm" trên phần PHP của Trạng thái Drupal.....
Chỉnh sửa tham số Memory_Limit trong PHP.Tệp INI (thường trong một phần gọi là giới hạn tài nguyên).....
Khởi động lại Apache ..

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

Kích thước bộ nhớ cho phép của 1610612736 byte cạn kiệt ???Ai đó có thể giúp tôi điều này?Hãy thử tiền tố lệnh của bạn với Composer_Memory_Limit = -1.Điều này sẽ loại bỏ giới hạn bộ nhớ để thực hiện lệnh.prefixing your command with COMPOSER_MEMORY_LIMIT=-1 . This will remove the memory limit for the execution of the command.