Hướng dẫn how fix php fatal error out of memory? - làm thế nào để sửa lỗi php nghiêm trọng trong bộ nhớ?

Trong khi làm việc với PHP nếu bạn đang gặp lỗi Fatal Fatal: ra khỏi bộ nhớ (được phân bổ 49545216) (đã cố gắng phân bổ 77824 byte) lỗi sau đó không nên sốc. Chúng tôi biết rằng nó rất khó để khắc phục vấn đề này và đặc biệt là đối với ứng dụng lớn. Đôi khi chúng tôi khởi động lại dịch vụ Apache và điều này đã giải quyết vấn đề nhưng nó là một phương pháp tạm thời. Nếu bạn cần giải quyết vấn đề này vĩnh viễn thì bạn phải tăng bộ nhớ được phân bổ cho PHP. Trong bài viết này, chúng tôi sẽ giải thích rằng làm thế nào để giải quyết vấn đề này. Hãy để xem cách chúng ta có thể giải quyết vấn đề này ....PHP Fatal error: Out of memory (allocated 49545216) (tried to allocate 77824 bytes)” error then don’t be shock. We know that it’s hard to fix this problem and especially for the large application. Sometimes we restarted apache service and this solved the issue but it’s a temporary method. If you need to solve this problem permanently then you have to increase the allocated memory for PHP. In this article we are going to explain that how to solve this problem. Let’s see how we can solve this problem....

1. Nếu bạn gặp lỗi nghiêm trọng khi làm việc với PHP thì bạn phải thực hiện một số thay đổi trong tệp php.ini. Như bạn đã biết Php.ini là một tệp cấu hình thực thi trên máy chủ khi PHP bắt đầu. Đôi khi lỗi nghiêm trọng này xảy ra do giới hạn bộ nhớ thấp, vì vậy trước tiên chúng ta phải kiểm tra các giới hạn bộ nhớ hiện tại với phpinfo (). 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.phpinfo(). Create a phpinfo.php file under root directory and check for current memory limits.

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

2. Nếu bạn không có quyền truy cập vào tệp php.ini thì bạn cũng có thể tăng giới hạn bộ nhớ PHP thông qua tệp .htaccess và bạn không phải tạo tệp php.ini. Bạn chỉ cần thêm dòng này vào tệp .htaccess:php.ini file then you can also increase the PHP memory limits through .htaccess file and you don’t have to create php.ini file. You just have to add this line in .htaccess file:

Mã số:

php_value memory_limit 32M

3. Nếu bạn không thể làm theo cả hai bước trên vì một số lý do thì bạn có một tùy chọn khác, bạn cũng có thể thêm dòng bên dưới trong tệp PHP cụ thể là lỗi ném.

Mã số:

ini_set(’memory_limit’, ‘32M’);

3. Nếu bạn không thể làm theo cả hai bước trên vì một số lý do thì bạn có một tùy chọn khác, bạn cũng có thể thêm dòng bên dưới trong tệp PHP cụ thể là lỗi ném.web-config.php file by adding below code in the file.

Mã số:

define('WP_MEMORY_LIMIT', '32M');

3. Nếu bạn không thể làm theo cả hai bước trên vì một số lý do thì bạn có một tùy chọn khác, bạn cũng có thể thêm dòng bên dưới trong tệp PHP cụ thể là lỗi ném.

Nếu bạn thấy một thông báo lỗi tương tự như thông báo sau:

Lỗi nghiêm trọng: Hết bộ nhớ (được phân bổ 11111111) (đã cố gắng phân bổ 1111 byte) trong your_php_file.php trên dòng 111

Nó có nghĩa là việc thực hiện tệp PHP trên cần nhiều hơn bộ nhớ được phân bổ.

Một cách giải quyết có thể là:

1. Mở tệp vbulletin của bạn bao gồm/config.php.include/config.php file.

2. Bên dưới thẻ mở PHP Thêm dòng sau:

ini_set (‘memory_limit,‘ 128m,);

Mã sẽ trông như sau:

ini_set (‘memory_limit,‘ 128m,);
ini_set(‘memory_limit’, ‘128M’);

Theo cách này, bạn sẽ tăng giới hạn bộ nhớ cho tập lệnh của mình lên 128MB.

Giải pháp tương tự có thể được áp dụng cho các tập lệnh khác nhau. Bạn nên dán mã trên trong một tệp luôn được gọi khi tập lệnh được thực thi. Thông thường, các tập tin như vậy là các tệp cấu hình.

71

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Vì câu hỏi của tôi ngày càng dài hơn, tôi quyết định viết lại toàn bộ câu hỏi để làm cho nó tốt hơn và ngắn hơn.

Tôi chạy trang web của mình trên máy chủ chuyên dụng với bộ nhớ 8GB. Tôi hoàn toàn nhận thức được rằng tôi cần tăng giới hạn bộ nhớ đối với cài đặt php.ini. Tôi đã đặt nó từ 128m đến 256m và đến -1. Vẫn là vấn đề là sự kiên trì.

Lỗi nghiêm trọng: Hết bộ nhớ (được phân bổ 786432) (đã cố gắng phân bổ 24576 byte) trong D: \ www \ Football \ xem \ main.php trên dòng 81

Bộ nhớ ngoài không có ý nghĩa vì nó cho biết chỉ có 786432 byte được phân bổ và nó cần thêm 24576 byte.

786432 byte chỉ là 768 kilobyte và khá nhỏ.

Gợi ý

  • Lỗi xảy ra trên một dòng rất ngẫu nhiên. Nó không phải lúc nào cũng có lỗi trên dòng số 81.
  • Vào thời điểm cao điểm, Apache chỉ mất khoảng 500MB bộ nhớ. Tôi vẫn còn 6GB để dự phòng.
  • Không có vòng lặp vô hạn.
  • Kịch bản mất 1.042.424 byte. Nhận số này từ echo memory_get_peak_usage();
  • Kết quả từ MySQL là nhỏ (nhiều nhất là 12 hàng, hoàn toàn là văn bản, không có dữ liệu blob)
  • (Quan trọng) Nếu tôi khởi động lại Apache hai ngày một lần, lỗi không còn nữa. Nó thường xảy ra khi Apache đang chạy hơn 2 ngày.Important) If I restart Apache once every two days, the error is gone. It usually happens when Apache is running more than 2 days.
  • Tôi đã bao gồm hồ sơ kịch bản và bạn có thể nhận được nó ở đây.
  • Máy chủ chuyên dụng này hoàn toàn được sử dụng để chỉ chạy một trang web. Trang web này là một trang web lưu lượng truy cập cao với trung bình 1.000 khách mỗi phút. Vào thời điểm cao điểm, sẽ có 1.700 đến 2.000 khách truy cập cùng một lúc.

Máy chủ thông số kỹ thuật

HĐH: Windows 2008 R2 64 bit CPU: Intel Core i5 - 4 Cores RAM: 8 GB Apache 2.2 Php 5.3.1 Lưu trữ: 2 x 1 TB ổ cứng băng thông: 10 TB mỗi tháng
CPU: Intel Core i5 - 4 cores
RAM: 8 GB
Apache 2.2
PHP 5.3.1
Storage: 2 x 1 TB hard drives
Bandwidth: 10 TB per month

Dung dịch

Cuối cùng tôi đã điều chỉnh và khắc phục sự cố và tôi muốn chia sẻ nó ở đây những gì tôi đã làm để cải thiện:

  1. ini_set(’memory_limit’, ‘32M’);
    0 bị thiếu mà gây rối với động cơ tuyến đường của tôi. Mặc dù động cơ tuyến đường của tôi rất nhỏ, nhưng bằng cách bao gồm
    ini_set(’memory_limit’, ‘32M’);
    0, nó giúp giảm việc sử dụng bộ nhớ bằng cách không chạy động cơ tuyến đường của tôi. Hầu hết một phần trang web của tôi đều có nó và tôi quên đặt nó cho phần mới này.
  2. Giới hạn

    ini_set(’memory_limit’, ‘32M’);
    2 giúp. Trong máy chủ chuyên dụng khác của tôi, tôi có giới hạn
    ini_set(’memory_limit’, ‘32M’);
    2 của mình. Đối với máy chủ này, tôi đặt nó thành 0. Tôi luôn nghĩ rằng mỗi tập lệnh bị cô lập. Hãy nói nếu tập lệnh của tôi mất 800kb để chạy. Sau khi hoàn thành, Apache hoặc PHP sẽ miễn phí bộ nhớ 800kB. Có vẻ như nó không hoạt động theo cách này. Limited
    ini_set(’memory_limit’, ‘32M’);
    2 không giúp ngăn ngừa rò rỉ bộ nhớ bằng cách tạo quy trình mới sau khi giới hạn
    ini_set(’memory_limit’, ‘32M’);
    2 và quá trình cũ đang chết dần. Đây là cài đặt mới của tôi.

    ThreadsPerChild      1500
    MaxRequestsPerChild  10000 
    
  3. ini_set(’memory_limit’, ‘32M’);
    6 không làm giảm bộ nhớ nhiều hơn một chút. Nó không giúp nhiều nhưng mỗi chút tối ưu hóa đều có ích.

  4. Tôi đã sử dụng
    ini_set(’memory_limit’, ‘32M’);
    7 mà tôi chưa từng sử dụng trước đây như được đề xuất bởi những người cố gắng trả lời câu hỏi này. Tôi phải nói rằng đó là công cụ tuyệt vời và tôi đã tối ưu hóa một vài thứ để nó chạy nhanh hơn một chút.
  5. Tôi đã vô hiệu hóa một vài mô -đun Apache không cần thiết. Tôi đang cố gắng vô hiệu hóa từng cái một và để lại một vài ngày để đảm bảo nó hoạt động hoàn hảo trước khi tôi vô hiệu hóa một bài khác. Tôi có tất cả các phần mở rộng PHP không cần thiết bây giờ.
  6. Hầu hết các tập lệnh của tôi trong máy chủ này đã sử dụng theo cách truyền thống (không có mẫu, không có lớp cơ sở dữ liệu, PHP thuần túy, HTML và Hàm MySQL_* Legacy). Thành thật mà nói, nó chạy rất nhanh và sử dụng bộ nhớ cực nhỏ. Tuy nhiên, bảo trì kịch bản không dễ dàng lắm vì trang web ngày càng dài hơn. Tôi đã cố gắng chuyển đổi một số phần của trang web thành khung thích hợp (khung nhỏ của riêng tôi). Lý do mà tôi đã sử dụng khung của riêng mình vì nó nhỏ (3kb cho toàn bộ khung và chỉ bao gồm những gì tôi cần).
  7. Chuyển sang IIS7.5 Giải quyết hoàn toàn vấn đề này..

25

Tôi đã chạy theo cùng một loại vấn đề với máy chủ chết khi cố gắng sử dụng hoán đổi. Điều này là do mod_php không có bộ nhớ miễn phí. Vì vậy, các quá trình Apache tiếp tục phát triển hoặc đạt đến giới hạn bộ nhớ của Apache hoặc PHP hoặc, nếu không có giới hạn, làm hỏng máy chủ.mod_php does not free memory ever. So Apache processes keep growing either reaching apache or PHP's memory limit or, if there's no limit, crashing the server.

Khởi động lại Apache làm cho nó sinh ra các quy trình mỏng mới nhưng khi chúng chạy các tập lệnh PHP theo thời gian, chúng phát triển cho đến khi có vấn đề phát sinh.

Giải pháp là tạo ra các quy trình của Apache sau một số truy vấn nhất định được phục vụ để nó sẽ tạo ra các truy vấn mới (có một số câu hỏi liên quan đến điều đó) giảm tùy chọn cấu hình MaxRequestSperChild thành, giả sử 100 (mặc định là 1000).

Tất nhiên, điều này có thể làm giảm hiệu suất của máy chủ vì cần phải tiêu diệt và sinh ra các quy trình mới nhưng ít nhất nó vẫn giữ cho trang web hoạt động. Bạn có thể bị cám dỗ để tăng số lượng các quy trình chạy để giữ hiệu suất cao, hãy chắc chắn giới hạn bộ nhớ PHP (hoặc Apache) số X Max Số lượng quy trình không vượt qua RAM vật lý của máy chủ của bạn.

Đây là kinh nghiệm của tôi, hy vọng nó sẽ giúp.

Đã trả lời ngày 29 tháng 8 năm 2012 lúc 12:42Aug 29, 2012 at 12:42

2

Đối với người mới bắt đầu,

ini_set(’memory_limit’, ‘32M’);
8 sẽ không hữu ích ở đây. Nó sẽ chỉ trả về lượng bộ nhớ được phân bổ và đó là cùng một số gây ra lỗi.

ini_set(’memory_limit’, ‘32M’);
9 sẽ trả về lượng bộ nhớ hoạt động đang được phân bổ khi nó được gọi.

define('WP_MEMORY_LIMIT', '32M');
0 sẽ đặt khoản trợ cấp tối đa của dấu chân của PHP trên bộ nhớ hệ thống của bạn. Nếu bạn nhận được OOM ở mức 768k, việc tăng nó sẽ không khắc phục được sự cố.

Không có dấu hiệu nào về phiên bản PHP bạn đang sử dụng, nhưng tôi sẽ đề xuất nâng cấp ngay lập tức. Có một số lỗi trong đó Trình quản lý bộ nhớ của Zend không giải quyết được bộ nhớ, điều này sẽ dẫn bạn chính xác đến cùng một vấn đề.

Có phải cả máy chủ cục bộ và máy chủ sản xuất của bạn chạy cùng một phiên bản HĐH, cùng một bit dài và cùng một phiên bản PHP? Câu trả lời sẽ là không.

Nếu nó không liên quan đến vấn đề Windows

define('WP_MEMORY_LIMIT', '32M');
1, thì đó là một miền phụ và có thể trong Virtualhost và chỉ phân bổ 768k, nó gần như có vẻ như là một vấn đề về hệ điều hành.

Chạy

define('WP_MEMORY_LIMIT', '32M');
2 từ dấu nhắc lệnh khi bạn truy cập tập lệnh của mình. Bạn có thấy một chuỗi Apache bổ sung hoặc sử dụng bộ nhớ trên các quy trình tăng đột biến không?

Một ý tưởng cuối cùng là, chạy

define('WP_MEMORY_LIMIT', '32M');
3 và/hoặc
ini_set(’memory_limit’, ‘32M’);
6 sau mỗi vòng lặp cho hàng/cột bảng. Điều này sẽ xóa bộ đệm của bạn và lưu cho bạn một số bộ nhớ trong trường hợp đây là nơi xảy ra vấn đề.

Đã trả lời ngày 28 tháng 8 năm 2012 lúc 16:17Aug 28, 2012 at 16:17

Hướng dẫn how fix php fatal error out of memory? - làm thế nào để sửa lỗi php nghiêm trọng trong bộ nhớ?

Mike Mackffymike MackffyMike Mackintosh

13.6K6 Huy hiệu vàng58 Huy hiệu bạc85 Huy hiệu Đồng6 gold badges58 silver badges85 bronze badges

2

Tôi sẽ bắt đầu bằng cách nâng cấp PHP lên 5,4+ vì nó nhanh hơn tới 50% cho một số ứng dụng. Họ đã sửa một số lượng lớn rò rỉ bộ nhớ. Vui lòng xem BECNHAMRKS: http://news.php.net/php.ienters/57760

Đã trả lời ngày 27 tháng 8 năm 2012 lúc 8:55Aug 27, 2012 at 8:55

maxwell2022maxwell2022maxwell2022

2.8185 Huy hiệu vàng40 Huy hiệu bạc60 Huy hiệu Đồng5 gold badges40 silver badges60 bronze badges

1

Xin lưu ý rằng lỗi là

define('WP_MEMORY_LIMIT', '32M');
5 và không phải là
define('WP_MEMORY_LIMIT', '32M');
6.

Vì vậy, rò rỉ bộ nhớ ở nơi khác trên hệ thống. Có thể máy chủ MySQL sử dụng nhiều bộ nhớ hệ thống sau truy vấn nặng này, để lại Apache/PHP mà không có nó vật lý và hoán đổi.

Điều này sẽ giải thích lỗi luôn trên cùng một dòng (và/hoặc trong cùng một tập lệnh).

Đã trả lời ngày 29 tháng 8 năm 2012 lúc 9:34Aug 29, 2012 at 9:34

Luca Rainoneluca RainoneLuca Rainone

15.7K2 Huy hiệu vàng37 Huy hiệu bạc51 Huy hiệu Đồng2 gold badges37 silver badges51 bronze badges

1

Cài đặt XDebug và kích hoạt trình kích hoạt hồ sơ. Tạo tệp Profiler, sau đó đăng tệp lưu trữ nếu bạn vẫn không thể nói nguồn gốc của vấn đề.

Chỉnh sửa: Tệp hồ sơ của trang nơi rò rỉ bộ nhớ xảy ra tất nhiên!

Đã trả lời ngày 27 tháng 8 năm 2012 lúc 9:10Aug 27, 2012 at 9:10

CarmageddoncarmageddonCarmageddon

2.3254 Huy hiệu vàng31 Huy hiệu bạc56 Huy hiệu Đồng4 gold badges31 silver badges56 bronze badges

2

Lỗi gây tử vong: Hết bộ nhớ (được phân bổ được giải quyết Tôi có vấn đề tương tự, trong nhiều tháng không có giải pháp. Cuối cùng tôi đã kiểm tra một trong các thư mục Apache, tức là Tên tệp là HTTPD-MPM trong tệp đó bạn sẽ tăng MaxMemFree được đặt 2048 thành một cái gì đó cao hơn, tôi đã đưa của tôi lên 10000 cho MaxMemfree đầu tiên (ifmodule!
i had similar problem, for months no solution. finally i was checking in one of the apache folders i.e(\apache\conf\extra) i came across this file that controls the memory allocation of apache. the file name is httpd-mpm in that file you are to increase the MaxMemFree which is set 2048 to something higher, i took mine to 10000 for the first MaxMemFree (IfModule !mpm_netware_module) then made the second one MaxMemFree to 5000 IfModule mpm_netware_module.

Những điều này đã giải quyết vấn đề của tôi. hy vọng nó giúp

0

Tôi đoán rằng bạn đã không chỉnh sửa đúng

define('WP_MEMORY_LIMIT', '32M');
7 hoặc bạn chưa khởi động lại PHP và/hoặc máy chủ web.

Tạo một trang

define('WP_MEMORY_LIMIT', '32M');
8 trong docroot của bạn với nội dung
define('WP_MEMORY_LIMIT', '32M');
9 để đảm bảo bạn đang thay đổi đúng
define('WP_MEMORY_LIMIT', '32M');
7. Ngoài vị trí của tệp
define('WP_MEMORY_LIMIT', '32M');
7 mà máy chủ web đang sử dụng, nó cũng sẽ nêu bộ nhớ tập lệnh tối đa được phép.

Tiếp theo, tôi sẽ thêm một số dấu vết ngăn xếp vào trang của bạn để bạn có thể thấy chuỗi sự kiện dẫn đến điều này. Chức năng sau đây sẽ nắm bắt các lỗi nghiêm trọng và cung cấp thêm thông tin về những gì đã xảy ra.

register_shutdown_function(function()
{
    if($error = error_get_last())
    {
        // Should actually log this instead of printing out...
        var_dump($error);
        var_dump(debug_backtrace());
    }
});

Cá nhân, nginx + PHP-FPM là những gì tôi đã sử dụng trong nhiều năm kể từ khi tôi rời khỏi Apache chậm.

3

Có thể là một vấn đề với MySQL và số lượng kết nối mở, do đó tại sao nó tự sắp xếp khi bạn khởi động lại vài ngày một lần. Họ có tự động đóng khi tắt tập lệnh không?

Đã trả lời ngày 29 tháng 8 năm 2012 lúc 14:07Aug 29, 2012 at 14:07

Matt Humphreymatt HumphreyMatt Humphrey

1.5541 Huy hiệu vàng12 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge12 silver badges30 bronze badges

1

Này, tôi cũng gặp vấn đề tương tự trên máy chủ của mình. Tôi chỉ thay đổi những điều sau:

Thay đổi

define('WP_MEMORY_LIMIT', '32M');
7 thành ...

memory_limit = 128M

và thêm vào

ThreadsPerChild      1500
MaxRequestsPerChild  10000 
3

RLimitMEM 1073741824 2147483648

và khởi động lại Apache và tôi đã xóa lỗi:

Chỉ để tóm tắt (tôi đang thêm câu trả lời này khá khoảng cách từ câu hỏi ban đầu):

  • PHP không thể phân bổ những gì dường như là một lượng nhỏ bộ nhớ
  • Việc sử dụng bộ nhớ hiện tại tại thời điểm OCCRS + số lượng được yêu cầu nhỏ hơn giới hạn bộ nhớ hiện có hiệu lực
  • Hệ thống có sẵn 6GB để sử dụng PHP khi điều này xảy ra
  • Vì vấn đề được giải quyết bằng cách khởi động lại Apache - đó là Apache đang ngăn bộ nhớ từ Beig có sẵn cho PHP

Nếu tất cả đều có giá trị thì giải thích duy nhất có thể là 6GB rất phân mảnh - điều mà tôi nghĩ là hơi khó xảy ra. Bạn đã không nói làm thế nào PHP được gọi từ Apache - mod_php? FPM? FCGI?

Tôi sẽ bắt đầu bằng cách kiểm tra từng vị từ ở trên - đặc biệt là bộ nhớ miễn phí. Làm thế nào để bạn biết rằng có 6GB miễn phí khi xảy ra lỗi? Một nguyên nhân có khả năng là có một rò rỉ bộ nhớ xảy ra mà bạn không phát hiện ra.

Bạn đã không cung cấp bất kỳ chi tiết nào về cách Apache được cấu hình; Tôi cũng sẽ có một cái nhìn về việc giảm MaxRequestSperChild và MaxMemfree. . Nếu bạn cung cấp cài đặt cốt lõi từ cấu hình Apache thì có lẽ chúng ta có thể đưa ra đề xuất thêm.

Trừ khi bạn đang sử dụng rộng rãi AJAX, hãy đảm bảo thời gian giữ hàng của bạn là 2 hoặc ít hơn.

Hai sự thật sau đây chắc chắn chỉ ra rò rỉ bộ nhớ:

  1. Lỗi xuất hiện ở các dòng khác nhau trong mã của bạn,
  2. Lỗi báo cáo phân bổ bộ nhớ tương đối nhỏ.

Trước tiên tôi sẽ chỉ ra PDO, vô hiệu hóa tất cả các tiện ích mở rộng khác và để nó chạy qua đêm bằng cách sử dụng một cái gì đó như Siege / Apache Bench (AB). Bạn cũng có thể thử chạy nó bằng giao diện

ThreadsPerChild      1500
MaxRequestsPerChild  10000 
4 (chỉ cần đảm bảo bạn giữ cùng một giới hạn bộ nhớ).

Bạn có thể sử dụng chức năng

ini_set(’memory_limit’, ‘32M’);
8 ở cuối tập lệnh của mình để xem PHP bộ nhớ nghĩ rằng nó đã sử dụng bao nhiêu bộ nhớ.

Từ bình luận của bạn là 800 kb, điều đó ổn; Chắc chắn không phải là số lượng bộ nhớ khổng lồ sẽ gây ra một bộ nhớ ngoài ;-)

Cuối cùng, mặc dù tôi không khuyên bạn nên nâng cấp lên 5.4 tại thời điểm này, nhưng việc nâng cấp lên 5.3.x mới nhất có lẽ là đáng giá do nhiều lỗ hổng và rò rỉ đã được giải quyết kể từ 5.3.1

Đã trả lời ngày 27 tháng 8 năm 2012 lúc 9:17Aug 27, 2012 at 9:17

Ja͢ckja͢ckJa͢ck

168K36 Huy hiệu vàng256 Huy hiệu bạc 305 Huy hiệu Đồng36 gold badges256 silver badges305 bronze badges

2

Điều này đã xảy ra với tôi vài ngày trước. Tôi đã thực hiện một cài đặt mới và nó vẫn xảy ra. Theo như mọi người nhìn thấy và dựa trên thông số kỹ thuật máy chủ của bạn. Nhiều khả năng nó là một vòng lặp vô hạn. Nó có thể không có trên chính mã PHP mà theo các yêu cầu được thực hiện cho Apache.

Hãy nói khi bạn truy cập URL này http: // localhost/mysite/page_with_multiple_requestshttp://localhost/mysite/page_with_multiple_requests

Kiểm tra nhật ký truy cập của Apache của bạn nếu nhận được nhiều yêu cầu. Theo dõi yêu cầu đó và kiểm tra mã có thể gây ra 'nút cổ chai' cho hệ thống (exec của tôi () khi sử dụng sendmail). Tôi nói về tôi không cần phải là một 'vòng lặp vô hạn'. Nó có thể là một chức năng mất một thời gian để kết thúc. Hoặc có thể một số chức năng thực thi chương trình của PHP '

Bạn cũng có thể cần kiểm tra các yêu cầu AJAX (những yêu cầu thực thi khi trang tải). Nếu yêu cầu Ajax đó chuyển hướng đến cùng một URL

ví dụ. httpx: // localhost/mysite/page_with_multiple_requests

nó sẽ 'làm lại' các yêu cầu lại

Nó sẽ giúp nếu bạn đăng các dòng ngẫu nhiên hoặc chính mã mà tập lệnh kết thúc có thể có mã 'vòng lặp' ở đâu đó ở đó. IMHO PHP sẽ không chỉ gọi các dòng ngẫu nhiên mà không có gì.

http://blog.piratelufi.com/2012/08/browser-sending-multiple-requests-at-once/

Hầu hết thời gian bạn nhận được một lỗi như vậy, vấn đề là trong mã. Tôi không cố gắng nói rằng bạn đang viết mã tệ, tôi đang cố gắng nói rằng bạn cần phải quan sát cẩn thận những gì có trong đó sử dụng nhiều bộ nhớ này.

Luôn luôn nhớ "Bộ sưu tập rác trong PHP khá tệ", nó không giống như Java, bất kỳ ngôn ngữ nào khác. Có một cách để thực thi bộ sưu tập rác thông qua GC_COLLECT_CYCLE, nhưng, theo ý kiến ​​cá nhân của tôi, điều đó sẽ không giải quyết được vấn đề của bạn. Php miễn phí tất cả bộ nhớ được sử dụng để thực hiện một trang, một khi chu kỳ phản hồi yêu cầu hoàn tất, vì vậy bạn có thể gặp sự cố bộ nhớ, nếu tập lệnh của bạn chạy dài, giống như một tập lệnh nền (Gearman, v.v.), bởi vì, bộ nhớ không được giải phóng cho đến khi Script đang chạy.Garbage collection in PHP is pretty bad", it's not like Java, any other such language. there is a way to enforce garbage collection through gc_collect_cycle, but, in my personal opinion, that won't solve your problem. PHP free all memory used for executing a page, once request-response cycle is complete, so you may run into memory issues, if your script is long running, like a background script(Gearman etc), because, memory isn't freed till script is running.

Nếu ở trên không phải là trường hợp với SCR của bạn, PT và như bạn đã nói không có mã nào yêu cầu một lượng bộ nhớ khổng lồ như vậy, thì vấn đề chắc chắn là trong mã tự nó và nâng cấp lên bất kỳ phiên bản PHP nào sẽ không giải quyết được vấn đề. Tôi đã phải đối mặt với một trong các tập lệnh Gearman của tôi một lần và có một vấn đề với một trong các vòng lặp của tôi, nơi tôi đang nối thêm một biến vào một trong các mảng của tôi, bản thân biến rất nặng (khoảng 110kb dữ liệu). Vì vậy, tôi sẽ đề xuất, hãy kiểm tra cẩn thận mã của bạn.

Tàn phá

Tôi đã có một vấn đề tương tự với PHP:

1) Kiểm tra nhật ký lỗi của bạn. Loại bỏ mọi lỗi trước khi tiếp tục. 2) Cân nhắc sửa đổi cấu hình Apache của bạn để loại bỏ các mô -đun không sử dụng - điều này sẽ làm giảm dấu chân cần thiết của PHP - Đây là một liên kết tuyệt vời cho việc này - nó cụ thể cho WordPress nhưng vẫn rất hữu ích http://thethemefoundry.com/blog/optimize- apache-wordpress/

Để cung cấp cho bạn một ý tưởng về loại lỗi mà tôi tìm thấy, tôi đã có một số mã đang cố gắng đăng nội dung lên Facebook, Facebook sau đó đã sửa đổi API của họ để đã bị hỏng, tôi cũng đã sử dụng một 'Trình đọc hết hạn nội dung' về cơ bản có nghĩa là nó tiếp tục thử lại Để đăng nội dung này lên Facebook và để lại vô số đối tượng nằm trong bộ nhớ.

1

Từ tệp đầu ra hồ sơ, tôi đã nhận thấy một vài điều mà tôi không thích/tin tưởng nhiều và sẽ xem xét những điều này:

Ngoài việc không biết ý nghĩa của các số đầu ra để phát hiện sự bất thường hoặc cách các tập lệnh PHP hoạt động ..., đây không phải là vấn đề? Có một bao gồm vào cùng một tệp main.ph, trông giống như một thứ đệ quy?

2121 fl=D:\www\football\views\main.php
2122 fn=include::D:\www\football\views\main.php

Nhận thấy tệp

ThreadsPerChild      1500
MaxRequestsPerChild  10000 
6 đang sử dụng một số hàm chuỗi nhiều lần, tôi đoán rằng nó đang gọi các chức năng này trên dữ liệu được trả về bởi truy vấn của bạn:

________số 8

Nếu, giống như trong ngôn ngữ C, các chức năng này yêu cầu các chuỗi được chấm dứt ____37 hoặc một số đầu nối chuỗi khác để tránh các vấn đề về bộ nhớ, tôi sẽ xem xét các chuỗi được truy vấn của bạn trả về.

Bạn có thể đăng URL của trang web của bạn?

2

Đây là một lỗi đã biết trong PHP v 5.2 cho Windows, nó có mặt ít nhất là phiên bản 5.2.3: https://bugs.php.net/bug.php?id=41615

Không có bản sửa lỗi được đề xuất nào giúp chúng tôi, chúng tôi sẽ phải cập nhật PHP.

Cố gắng chạy PHP qua FCGID, điều này có thể giúp:

Đây là những lỗi cổ điển bạn sẽ thấy khi chạy PHP như một mô -đun Apache. Chúng tôi đã đấu tranh với những lỗi này trong nhiều tháng. Chuyển sang sử dụng PHP thông qua MOD_FCGID (như James khuyến nghị) sẽ khắc phục tất cả các vấn đề này. Hãy chắc chắn rằng bạn đã cài đặt gói phân phối lại C ++ trực quan mới nhất được cài đặt:

http://support.microsoft.com/kb/2019667

Ngoài ra, tôi khuyên bạn nên chuyển sang phiên bản 64 bit của MySQL. Không có lý do thực sự để chạy phiên bản 32 bit nữa.

Nguồn: sự cố Apache 2.4.6.0 do sự cố trong PHP5TS.DLL 5.5.1.0

0

Tôi muốn nói rằng máy chủ đang hết bộ nhớ vật lý/hoán đổi, vì vậy PHP không thể phân bổ đủ bộ nhớ.

Bạn có thể dán đầu ra của

ThreadsPerChild      1500
MaxRequestsPerChild  10000 
8 ở đây không?

Đã trả lời ngày 27 tháng 8 năm 2012 lúc 21:54Aug 27, 2012 at 21:54

Hướng dẫn how fix php fatal error out of memory? - làm thế nào để sửa lỗi php nghiêm trọng trong bộ nhớ?

Edson Medinaedson MedinaEdson Medina

9.3463 Huy hiệu vàng42 Huy hiệu bạc 50 Huy hiệu Đồng3 gold badges42 silver badges50 bronze badges

Đối với trường hợp của tôi, lỗi này đã được kích hoạt vì một truy vấn được chọn rất lớn (hàng trăm ngàn kết quả được trả lại).

Nó phát sinh ngay sau khi thêm hàng triệu bản ghi vào cơ sở dữ liệu của tôi để kiểm tra khả năng mở rộng của WordPress, vì vậy đó là lý do duy nhất có thể xảy ra đối với tôi.

Tôi biết đó là một chủ đề cũ, nhưng đây là kinh nghiệm của tôi để giải quyết nó.

Máy chủ của tôi là một dịch vụ được lưu trữ chạy Apache.

Kịch bản của tôi bị sập với bộ nhớ ở mức 6MB, khi giới hạn của tôi là 256MB - điên rồ, phải không?

Nó được gọi là đồng bộ thông qua một cuộc gọi lại HTTP, từ JavaScript chạy trên máy khách của tôi và bị sập sau khoảng 550 cuộc gọi. Sau nhiều thời gian lãng phí với những kẻ "hỗ trợ leo thang" bất tài, kịch bản của tôi giờ đã chạy một cách kỳ diệu.

Họ nói tất cả những gì họ đã làm là đặt lại Php.ini, nhưng tôi đã kiểm tra sự khác biệt:

Hướng dẫn how fix php fatal error out of memory? - làm thế nào để sửa lỗi php nghiêm trọng trong bộ nhớ?

Không có thay đổi nào mà tôi có thể thấy rằng có thể có lỗi vì lỗi bộ nhớ.

Tôi nghi ngờ rò rỉ bộ nhớ trong máy chủ web mà anh chàng "hỗ trợ leo thang" của tôi đang trốn dưới vỏ bọc đặt lại php.ini. Và, thực sự, tôi không phải là một nhà lý luận âm mưu.

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 để sửa lỗi cho phép lỗi cho phép kích thước bộ nhớ?

Khắc phục lỗi cho phép Kích thước bộ nhớ WP với WHM Đăng nhập vào WHM. Chuyển đến "Trình chỉnh sửa Ini Multiphp". Nếu bạn có nhiều phiên bản PHP trên máy chủ, hãy đặt phiên bản chịu trách nhiệm cho vấn đề với trang web WordPress của bạn. Cuộn xuống nơi nó nói "Memory_limit" và ngay lập tức làm cho nó 256m hoặc thậm chí 512m.Log in to WHM. Go to "MultiPHP INI Editor". If you have multiple PHP versions on the server, set the one that is responsible for the problem with your Wordpress website. Scroll down where it says "memory_limit" and immediately make it 256M or even 512M.

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 để sửa lỗi cho phép Fatal Fatal cho phép Kích thước bộ nhớ 134217728 byte cạn kiệt?

Thay đổi giới hạn bộ nhớ trong tệp php.ini và khởi động lại Apache.Sau khi khởi động lại, chạy phpinfo ();chức năng từ bất kỳ tệp PHP nào để xác nhận thay đổi bộ nhớ_limit.Giới hạn bộ nhớ -1 có nghĩa là không có giới hạn bộ nhớ được đặt. ini file and restart Apache. After the restart, run the phpinfo(); function from any PHP file for a memory_limit change confirmation. Memory limit -1 means there is no memory limit set.