Hướng dẫn sửa lỗi PHP Fatal Error: Allowed Memory Size Exhausted

623
28-03-2018
Hướng dẫn sửa lỗi PHP Fatal Error: Allowed Memory Size Exhausted

Đây là hướng dẫn về cách tránh và/ hoặc sửa một trong những lỗi nghiêm trọng nhất của PHP: Lỗi hết bộ nhớ. Dưới đây, Bizfly Cloud  sẽ đưa ra ví dụ về lỗi này:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in your-script.php on line 4

Nguyên nhân

Một vài trường hợp bạn có thể gặp lỗi này khi hết bộ nhớ:

- Việc chọn các hàng từ một database và sau đó thêm chúng vào một PHP array là một thao tác tốt. Tuy nhiên, nếu bạn đang áp dụng cho hàng triệu hàng và cột, điều này có thể gây nên vấn đề.

- Nếu script có arrays lớn và rất nhiều vòng lặp có thể gây hết bộ nhớ. Điều này đặc biệt đúng nếu bạn có nhiều vòng lặp và/ hoặc bạn đang gọi rất nhiều hàm bên trong các vòng lặp đó.

- Lặp đi lặp lại đệ quy thông qua các multi-dimensional arrays.

- Tự động tạo hoặc thay đổi kích thước hình ảnh khi đang hoạt động.

Cách khắc phục

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

Trong đoạn mã trên, hàm ini_set của PHP đang được sử dụng để tăng lượng bộ nhớ mà tập lệnh có thể sử dụng. Đây là một giải pháp khủng khiếp vì nó không cố gắng khắc phục vấn đề cơ bản và nó có khả năng dẫn đến việc máy chủ web hết RAM. Dòng mã này cố gắng khắc phục bằng cách cho script 1GB bộ nhớ.

Một ví dụ nguy hiểm hơn:

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

Về cơ bản, điều này nói với PHP script rằng không có giới hạn về số lượng bộ nhớ mà nó có thể sử dụng.

Để khắc phục vấn đề này, cách tiếp cận tốt hơn là:

- Sử dụng debugger như Xdebug để profile cho script của bạn và tìm ra nơi rò rỉ bộ nhớ đến từ đâu.

- Hãy chắc chắn rằng các PHP arrays không quá lớn và tránh bất kỳ loops không cần thiết nào. Tức là nếu bạn có hai loops cho cùng một array, thì bạn nên cố gắng tìm cách kết hợp chúng thành một.

- Hãy cẩn thận về lượng dữ liệu mà bạn đang trả lại từ cơ sở dữ liệu. Nếu bạn đang trả về nhiều hàng từ database, thì bạn nên đảm bảo rằng bạn chỉ chọn các cột mà tập lệnh của bạn sẽ sử dụng. Tức là Đừng lười biếng bằng cách thực hiện "SELECT * FROM" vì lệnh này sẽ trả về mọi cột, mặc dù tập lệnh chỉ có thể sử dụng hai trong số chúng.

- Sử dụng hàm unset của PHP để loại bỏ các biến mà bạn không còn sử dụng nữa, vì điều này có thể giúp giải phóng thêm bộ nhớ cho script. Tức là nếu bạn vừa lặp qua một array lớn mà bạn không còn ý định sử dụng, thì bạn có thể loại bỏ nó bằng cách chuyển nó vào hàm unset.

Dịch từ: thisinterestsme.com/fix-fatal-memory-bytes-exhausted/

>> Có thể bạn quan tâm: Nguyên nhân và giái pháp cho "LFD: Excessive resource usage" trên CSF Firewall

BizFly Cloud là nhà cung cấp dịch vụ điện toán đám mây với chi phí thấp, được vận hành bởi VCCorp.

BizFly Cloud là một trong 4 doanh nghiệp nòng cốt trong "Chiến dịch thúc đẩy chuyển đổi số bằng công nghệ điện toán đám mây Việt Nam" của Bộ TT&TT; đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật của nền tảng điện toán đám mây phục vụ Chính phủ điện tử/chính quyền điện tử.

Độc giả quan tâm đến các giải pháp của BizFly Cloud có thể truy cập tại đây.

DÙNG THỬ MIỄN PHÍ và NHẬN ƯU ĐÃI 3 THÁNG tại: Manage.bizflycloud

SHARE