Hướng dẫn out of memory php - hết bộ nhớ php

Hướng dẫn out of memory php - hết bộ nhớ php

Lỗi này nói cho ta biết rằng, các tiến trình ứng dụng PHP đang thực thi lượng dữ liệu lớn tiêu ngốn nhiều tài nguyên RAM bộ nhớ, nhưng bị giới hạn bởi tài nguyên bộ nhớ được phép cấp cho 1 tiến trình PHP thực thi (do ta quy định trong php.ini hoặc trong code/.htaccess thông qua giá trị biến “memory_limit” được lập trình viên/quản trị viên quy định). Tiến trình yêu cầu được cấp thêm bộ nhớ để tiến trình PHP có thể hoạt động ổn định. tiêu ngốn nhiều tài nguyên RAM bộ nhớ, nhưng bị giới hạn bởi tài nguyên bộ nhớ được phép cấp cho 1 tiến trình PHP thực thi (do ta quy định trong php.ini hoặc trong code/.htaccess thông qua giá trị biến “memory_limit” được lập trình viên/quản trị viên quy định). Tiến trình yêu cầu được cấp thêm bộ nhớ để tiến trình PHP có thể hoạt động ổn định.

Vì vậy khi gặp lỗi này, ta thường có 2 cách :– Nâng mức giới hạn bộ nhớ cho tiến trình PHP cao hơn. Nâng giá trị “memory_limit“.– Kiểm tra lại source code website sao PHP tiến trình lại chiếm nhiều bộ nhớ đến vậy (tất nhiên là mức bộ nhớ giới hạn cho tiến trình phải phù hợp)
– Nâng mức giới hạn bộ nhớ cho tiến trình PHP cao hơn. Nâng giá trị “memory_limit“.
– Kiểm tra lại source code website sao PHP tiến trình lại chiếm nhiều bộ nhớ đến vậy (tất nhiên là mức bộ nhớ giới hạn cho tiến trình phải phù hợp)

Nếu bạn không chắc mức giá trị cấu hình PHP memory limit đã set thì bạn có thể nhận biết dựa vào lỗi trả về từ PHP error. Sau đây là danh sách các mức cấu hình memory_limit thường sử dụng tương ứng, từ đây bạn có thể so sánh đối chiếu để nâng mức giá trị cấu hình :

  • PHP: Fatal Error: Allowed Memory Size of 8388608 Bytes Exhausted – 8 MB8388608 Bytes Exhausted – 8 MB
  • PHP: Fatal Error: Allowed Memory Size of 16777216 Bytes Exhausted – 16 MB16777216 Bytes Exhausted – 16 MB
  • PHP: Fatal Error: Allowed Memory Size of 33554432 Bytes Exhausted – 32 MB33554432 Bytes Exhausted – 32 MB
  • PHP: Fatal Error: Allowed Memory Size of 67108864 Bytes Exhausted – 64 MB67108864 Bytes Exhausted – 64 MB
  • PHP: Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted – 128 MB134217728 Bytes Exhausted – 128 MB
  • PHP: Fatal Error: Allowed Memory Size of 268435456 Bytes Exhausted – 256 MB268435456 Bytes Exhausted – 256 MB
  • PHP: Fatal Error: Allowed Memory Size of 536870912 Bytes Exhausted – 512 MB536870912 Bytes Exhausted – 512 MB
  • PHP: Fatal Error: Allowed Memory Size of 1073741824 Bytes Exhausted – 1 GB1073741824 Bytes Exhausted – 1 GB

1. Xác định file php.ini

Bạn sẽ xác định vị trí file php.ini bằng lệnh command line sau :

# php -i | grep “php.ini”

Loaded Configuration File => /usr/local/php56/lib/php.ini

2. Tăng giá trị memory_limit

Giả sử trong ví dụ cấu hình này, giới hạn bộ nhớ là 128M, nhưng vẫn bị báo lỗi là không đủ thì ta sẽ nâng cấp thêm bộ nhớ cho tiến trình PHP trong điều kiện bộ nhớ RAM còn đủ xài.

# vi /usr/local/php56/lib/php.ini

memory_limit = 128M

Thành

memory_limit = 256M

3. Khởi động lại dịch vụ PHP

Nếu PHP là module Apache thì khởi động lại Apache

# /etc/init.d/httpd restart

Nếu PHP hoạt động như PHP-FPM.

# /etc/init.d/phpfpm restart

Mình thì sử dụng directadmin chạy php-fpm56 và php-fpm70

Để chắc chắn restart đúng PHP mình gõ lệnh như sau:

#cd /etc/init.d/

Sau đó restart các file sau:

#/etc/init.d/directadmin restart

#/etc/init.d/php-fpm56 restart

#/etc/init.d/php-fpm70 restart

4. Cấu hình giá trị memory_limit

Trong trường hợp bạn không có quyền truy cập chính sửa file php.ini trên hệ thống, thì bạn có thể quy định mức giới hạn bộ nhớ bằng file .htaccess với nội dung như sau:.htaccess với nội dung như sau:

#vi ./.htaccess

php_value memory_limit 256M

Tôi vừa được thừa hưởng một trang web có tập lệnh PHP luôn hết bộ nhớ ở mức 117 MB. Điều này xảy ra ngay cả khi tôi tăng biến bộ nhớ của PHP lên 312 MB, mà tôi đang làm thông qua php.ini.

Nội dung chính

  • Làm thế nào để sửa lỗi nghiêm trọng của PHP ra khỏi bộ nhớ?
  • 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?
  • Làm cách nào để tăng giới hạn bộ nhớ của tôi?
  • Giới hạn bộ nhớ PHP là gì?

Theo tài liệu PHP: Từ Điều này đặt số lượng bộ nhớ tối đa trong byte mà tập lệnh được phép phân bổ.Điều này giúp ngăn chặn các tập lệnh được viết kém ăn hết bộ nhớ có sẵn trên máy chủ.Giá trị mặc định là 128MB.The default value is 128MB .

Tôi vừa được thừa hưởng một trang web có tập lệnh PHP luôn hết bộ nhớ ở mức 117 MB. Điều này xảy ra ngay cả khi tôi tăng biến bộ nhớ của PHP lên 312 MB, mà tôi đang làm thông qua php.ini.

Nội dung chính

Điều này hiện đã được giải quyết nhờ một manh mối tuyệt vời từ PCGuru. Xem câu trả lời của tôi dưới đây bắt đầu: Cuối cùng tôi đã tìm thấy câu trả lời

Kịch bản này đứng sau tên người dùng/mật khẩu và tôi không thể cung cấp quyền truy cập công khai vào nó.

Chỉnh sửa để thêm:

1) Cảm ơn tất cả vì sự giúp đỡ của bạn cho đến nay. Bạn sẽ tìm thấy thêm thông tin trong các câu trả lời của tôi đối với các bình luận của người dùng cụ thể trong các câu trả lời khác nhau bên dưới.

2) Suhosin chắc chắn không được cài đặt. Tôi đã kiểm tra ở nhiều nơi bao gồm chạy tập lệnh và kiểm tra các hằng số và chạy PHP -V

3) Nhật ký Apache không có bản ghi về thông báo lỗi cụ thể mà tôi nhận được. Ghi nhật ký được bật trong php.ini. Tôi đi qua grep để tìm kiếm toàn bộ nhật ký.

4) Có thể có lỗi sai đang được báo cáo trong trường hợp này không?

Hakre

187K48 Huy hiệu vàng419 Huy hiệu bạc804 Huy hiệu đồng48 gold badges419 silver badges804 bronze badges48 gold badges419 silver badges804 bronze badges

Hỏi ngày 19 tháng 12 năm 2012 lúc 15:41Dec 19, 2012 at 15:41Dec 19, 2012 at 15:41

19

Cuối cùng tôi đã tìm thấy câu trả lời. Manh mối đến từ câu trả lời của PCGuru bắt đầu 'vì máy chủ chỉ có 1 GB RAM ...'.

Trên một linh cảm, tôi đã xem xét liệu Apache có giới hạn bộ nhớ của riêng mình hay không vì những người đó có khả năng ảnh hưởng đến khả năng phân bổ bộ nhớ của PHP. Ngay trên đỉnh của httpd.conf Tôi đã tìm thấy tuyên bố này: rlimitmem 204535125

Điều này được đặt ở đó bởi WHM/cPanel. Theo trang web sau đây whm/cPanel tính toán không chính xác giá trị của nó trên máy chủ ảo ... http://forums.jaguarpc.com

Kịch bản chạy ra khỏi bộ nhớ được hầu hết các cách, vì vậy tôi đã tăng rlimitmem lên 268435456 (256 MB) và reran tập lệnh. Nó đã hoàn thành việc hợp nhất mảng của nó và sản xuất tệp CSV để tải xuống.

ETA: Sau khi đọc thêm về rlimitmem và rlimitcpu, tôi đã quyết định loại bỏ chúng khỏi httpd.conf. Điều này cho phép ini_set ('memory_limit', '### m') hoạt động và bây giờ tôi cung cấp cho tập lệnh cụ thể đó bộ nhớ thêm mà nó cần. Tôi cũng nhân đôi RAM trên máy chủ đó.

Cảm ơn tất cả mọi người vì sự giúp đỡ của bạn trong việc phát hiện vấn đề khá gai góc này, và đặc biệt là PCGuru, người đã đưa ra manh mối quan trọng đã đưa tôi đến giải pháp.

Đã trả lời ngày 20 tháng 12 năm 2012 lúc 7:53Dec 20, 2012 at 7:53Dec 20, 2012 at 7:53

user8109user8109user8109user8109

7581 Huy hiệu vàng5 Huy hiệu bạc11 Huy hiệu đồng1 gold badge5 silver badges11 bronze badges1 gold badge5 silver badges11 bronze badges

Vì máy chủ chỉ có 1 GB RAM, tôi đang nghiêng về khả năng bạn thực sự hết bộ nhớ hệ thống.

Xem chủ đề này. Bạn nhận được cùng một "lỗi nghiêm trọng của PHP: ra khỏi bộ nhớ" thay vì "lỗi gây tử vong phổ biến hơn: kích thước bộ nhớ được phép của ...". Lỗi của bạn cho biết hệ thống không thể phân bổ nhiều bộ nhớ hơn, có nghĩa là ngay cả các hàm bên trong của PHP: S không thể phân bổ nhiều bộ nhớ hơn, chứ đừng nói đến mã của riêng bạn.

Php được cấu hình như thế nào để chạy với Apache? Như một mô -đun hoặc là CGI? Bạn có thể chạy bao nhiêu quá trình PHP cùng một lúc? Bạn có sẵn không gian hoán đổi không?

Nếu bạn sử dụng PHP làm mô -đun trong Apache, Apache có thói quen khó chịu là giữ bộ nhớ mà quá trình PHP được phân bổ. Đoán vì nó không thể khởi động lại mô -đun PHP trong công nhân, chỉ cần khởi động lại hoàn toàn công nhân. Mỗi công nhân đã phục vụ PHP chỉ đơn giản là phát triển đến giới hạn bộ nhớ PHP theo thời gian vì công nhân đó phục vụ một kịch bản phân bổ rất nhiều RAM. Vì vậy, nếu bạn có nhiều công nhân cùng một lúc, mỗi người sử dụng 100 MB+, bạn sẽ nhanh chóng hết RAM. Hãy thử giới hạn số lượng công nhân đồng thời ở Apache.

Đã trả lời ngày 19 tháng 12 năm 2012 lúc 20:58Dec 19, 2012 at 20:58Dec 19, 2012 at 20:58

Oldwizardoldwizardoldwizardoldwizard

4.9422 Huy hiệu vàng30 Huy hiệu bạc31 Huy hiệu Đồng2 gold badges30 silver badges31 bronze badges2 gold badges30 silver badges31 bronze badges

4

Đây có thể không phải là câu trả lời cho vấn đề của bạn, nhưng nếu bạn chạy PHP từ dòng lệnh, bạn có thể ghi đè giới hạn bộ nhớ từ php.ini.

php -d memory_limit=321M my_script.php

Tôi không chắc chắn chính xác giới hạn bộ nhớ mặc định qua CLI là gì.

Ngoài ra, bạn có thể chạy php --ini và kiểm tra kết quả.

Đã trả lời ngày 19 tháng 12 năm 2012 lúc 15:52Dec 19, 2012 at 15:52Dec 19, 2012 at 15:52

Aebersoldaebersoldaebersoldaebersold

10,7k2 Huy hiệu vàng19 Huy hiệu bạc29 Huy hiệu đồng2 gold badges19 silver badges29 bronze badges2 gold badges19 silver badges29 bronze badges

3

Đây không phải là câu trả lời cho lý do tại sao tập lệnh của bạn chết sau khi sử dụng bộ nhớ nhất định, nhưng bạn có thể vượt qua nó bằng cách xóa hoàn toàn giới hạn bộ nhớ trong chính tập lệnh PHP:

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

Điều này nguy hiểm. Nếu bạn có một tập lệnh chạy trốn, PHP sẽ lấy bộ nhớ cho đến khi máy chủ của bạn không còn lại để phân bổ và giảm. Vì vậy, bạn chỉ nên sử dụng điều này nếu bạn chắc chắn rằng tập lệnh không phải là vấn đề và chỉ để kiểm tra đầu ra. If you have a runaway script, PHP will take memory until your server has none left to allocate and falls over. So you should only use this if you're sure the script itself isn't a problem, and only to test the output. If you have a runaway script, PHP will take memory until your server has none left to allocate and falls over. So you should only use this if you're sure the script itself isn't a problem, and only to test the output.

Đối với nếu PHP có một số giới hạn trên mỗi kịch bản về việc sử dụng bộ nhớ, không. Cá nhân tôi đã chạy các tập lệnh với việc sử dụng bộ nhớ gần 1GB.

Đã trả lời ngày 19 tháng 12 năm 2012 lúc 16:31Dec 19, 2012 at 16:31Dec 19, 2012 at 16:31

K.A.F.K.A.F.K.A.F.K.A.F.

2.1871 Huy hiệu vàng15 Huy hiệu bạc17 Huy hiệu đồng1 gold badge15 silver badges17 bronze badges1 gold badge15 silver badges17 bronze badges

2

Bạn có một vòng lặp vô hạn ở đâu đó trong mã của bạn.

Đã trả lời ngày 19 tháng 12 năm 2012 lúc 16:09Dec 19, 2012 at 16:09Dec 19, 2012 at 16:09

Peter Kisspeter KissPeter KissPeter Kiss

9.3092 Huy hiệu vàng22 Huy hiệu bạc38 Huy hiệu Đồng2 gold badges22 silver badges38 bronze badges2 gold badges22 silver badges38 bronze badges

3

Làm thế nào để sửa lỗi nghiêm trọng của PHP ra khỏi bộ nhớ?

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. 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 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ớ của tôi?

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

Giới hạn bộ nhớ PHP là gì?

Theo tài liệu PHP: Từ Điều này đặt số lượng bộ nhớ tối đa trong byte mà tập lệnh được phép phân bổ.Điều này giúp ngăn chặn các tập lệnh được viết kém ăn hết bộ nhớ có sẵn trên máy chủ.Giá trị mặc định là 128MB.The default value is 128MB .The default value is 128MB .