PHP Fatal Error: Allowed Memory Size of x bytes exhausted là 1 lỗi phổ biến các bạn có thể gặp tình trạng này khi chạy 1 tiến trình nào đó của PHP trên website, cài theme Magento v.v.
Lỗi này là do PHP thực hiện lượng dữ liệu lớn nhưng lại bị giới hạn bộ nhớ khiến cho tình trạng quá tải xảy ra.
Khi bị lỗi này thường các bạn sẽ nhận được thông báo như sau.
Để fix lỗi này các bạn cần mở php.ini lên.
Đầu tiên các bạn mở xampp vào mục config ở dòng Apache và chọn PHP[php.ini]
Sau đó các bạn tìm kiếm từ
echo 'XuanthuLab'2 bằng tổ hợp phím Ctrl + F.
Các bạn tăng mức giới hạn lên bằng cách sửa số 128 thành 1024.
Sửa xong các bạn lưu lại và kiểm tra thành quả.
Vậy là chúng ta đã fix lỗi thành công.
Cảm ơn các bạn đã đọc bài viết.
Khi code thi hành gặp lệnh // Hiện thị tất cả các lỗi
error_reporting[E_ALL];
// Hoặc E_DEPRECATED và E_STRICT
error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]
7 thì khối code đó sẽ dừng tại // Hiện thị tất cả các lỗi
error_reporting[E_ALL];
// Hoặc E_DEPRECATED và E_STRICT
error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]
7
Giờ bạn sử dụng hàm, trường hợp này sẽ phát sinh ngoại lệ:
- Vấn đề về các lỗi trong PHP
- Hàm error_reporting[] trong PHP
- Hàm trigger_error[] trong PHP
- Hàm set_error_handler[] trong PHP
- Ngoại lệ - Exception trong PHP
- throw Exception - phát sinh ngoại lệ
- Bắt ngoại lệ - try catch trong PHP
- Tạo ngoại lệ riêng PHP
- Hàm set_exception_handler trong PHP
Tổng quan về các lỗi trong PHP
Trong quá trình ứng dụng PHP [Website PHP] hoạt động, có thể có lỗi xảy ra, có những lỗi cảnh báo nhưng Script PHP vẫn chạy, có những lỗi làm cho chương trình kết thúc ngay lập tức, có những lỗi do bản thân hệ thống, có những lỗi do logic chương trình có vấn đề. Trong PHP các lỗi được phân ra thành các nhóm [loại]: Mỗi nhóm biểu diễn bởi một giá trị và được định nghĩa bởi một hằng số trong PHP
Bảng danh sách phân loại các lỗi, cảnh báo trong PHP1 | echo 'XuanthuLab'3 | Lỗi nghiêm trọng [Fatal Error] script bị kết thúc, lỗi xảy ra như tràn bộ nhớ ... Ví dụ, bạn gọi một hàm không tồn tại. hamnaykhongtontai[]; | |
2 | echo 'XuanthuLab'4 | Cảnh báo khi thực thi. Lỗi này không dẫn đến script bị dừng. Ví dụ, nạp một mã nguồn php bằng include, trong khi file đó không tồn tại: include ["file-ma-nguon-nay-khong-co.php"]; | |
4 | echo 'XuanthuLab'5 | Lỗi phát sinh do trình parser [phân tích cú pháp] - nó cũng kết thúc script, ví dụ bạn viết echo xuất ra một chuỗi, mà thiếu dấu ; ở cuối. echo 'XuanthuLab'echo xuất ra một chuỗi, mà thiếu dấu ; ở cuối. echo 'XuanthuLab' | |
8 | echo 'XuanthuLab'6 | Cánh báo cho biết có thể có lỗi, vì PHP không chắc chắn đó là lỗi hay không. | |
16 | echo 'XuanthuLab'7 | Giống echo 'XuanthuLab'3 do nhân PHP phát sinh echo 'XuanthuLab'3 do nhân PHP phát sinh | |
32 | echo 'XuanthuLab'9 | Giống echo 'XuanthuLab'4 do nhân PHP phát sinh. echo 'XuanthuLab'4 do nhân PHP phát sinh. | |
64 | ; Bật hiện thị các thông báo lỗi display_errors = On ; Thiết lập các lỗi hiện thị - tất cả các lỗi ; Môi trường phát triển nên thiết lập error_reporting = E_ALL1 | Giống echo 'XuanthuLab'3 phát sinh bởi Zend Scripting Engine. echo 'XuanthuLab'3 phát sinh bởi Zend Scripting Engine. | |
128 | ; Bật hiện thị các thông báo lỗi display_errors = On ; Thiết lập các lỗi hiện thị - tất cả các lỗi ; Môi trường phát triển nên thiết lập error_reporting = E_ALL3 | Giống echo 'XuanthuLab'4, phát sinh bởi Zend Scripting Engine. echo 'XuanthuLab'4, phát sinh bởi Zend Scripting Engine. | |
256 | ; Bật hiện thị các thông báo lỗi display_errors = On ; Thiết lập các lỗi hiện thị - tất cả các lỗi ; Môi trường phát triển nên thiết lập error_reporting = E_ALL5 | Giống echo 'XuanthuLab'3, do code của bạn tự phát sinh bằng cách gọi hàm trigger_error[] echo 'XuanthuLab'3, do code của bạn tự phát sinh bằng cách gọi hàm trigger_error[] | |
512 | ; Bật hiện thị các thông báo lỗi display_errors = On ; Thiết lập các lỗi hiện thị - tất cả các lỗi ; Môi trường phát triển nên thiết lập error_reporting = E_ALL7 | Giống echo 'XuanthuLab'4, do code của bạn tự phát sinh bằng cách gọi hàm trigger_error[] echo 'XuanthuLab'4, do code của bạn tự phát sinh bằng cách gọi hàm trigger_error[] | |
1024 | ; Bật hiện thị các thông báo lỗi display_errors = On ; Thiết lập các lỗi hiện thị - tất cả các lỗi ; Môi trường phát triển nên thiết lập error_reporting = E_ALL9 | Giống echo 'XuanthuLab'6, do code của bạn tự phát sinh bằng cách gọi hàm trigger_error[] echo 'XuanthuLab'6, do code của bạn tự phát sinh bằng cách gọi hàm trigger_error[] | |
2048 | ; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT1 | Gợi ý của PHP để code của bạn tương thích được cho các bản tiếp theo. | |
4096 | ; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT2 | Có thể là lỗi nghiêm trọng, nếu không bắt lại bởi error_hander thì script dừng với lỗi echo 'XuanthuLab'3. echo 'XuanthuLab'3. | |
8192 | ; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT4 | Thông báo - code của bạn có thể không hoạt động cho phiên bản tiếp theo của PHP | |
16384 | ; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT5 | Giống ; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT4 ; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT4 | |
32767 | ; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT7 | Tất cả lỗi |
Thiết lập các thông báo lỗi error_reporting[] trong PHP
Khi có một lỗi xảy ra, ứng dụng PHP của bạn có thể nhận được thông báo lỗi - hoặc không nhận được tùy theo cấu hình PHP. Nếu bạn thiết lập nhận thông báo lỗi, nếu lỗi xảy ra - chương trình bị dừng bạn sẽ đọc được thông tin về lỗi, như tên lỗi, file / dòng code xảy ra lỗi ... . Nếu bạn không thiết lập nhận thông báo lỗi, thì chương trình bị dừng mà bạn không đọc được.
Cơ bản, trong môi trường phát triển, bạn nên thiết lập nhận tất cả các thông báo lỗi, kể các các lỗi không nghiêm trọng, các cảnh báo E_NOTICE. Còn trong môi trường Product [website đang chạy phục vụ khách hàng] thì bạn nên tắt đi việc nhận các lỗi này để đảm bảo an toàn, dấu vết về lỗi không hiện thị cho khách truy cập mà sẽ lưu ở log.
Để thiết lập các lỗi nhận được, có 2 cách: Thiết lập trong file cấu hình của PHP là php.ini hoặc trực tiếp trong code của bạn với hàm
; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT8.
Thiết lập nhận thông báo lỗi trong php.ini
; Bật hiện thị các thông báo lỗi display_errors = On ; Thiết lập các lỗi hiện thị - tất cả các lỗi ; Môi trường phát triển nên thiết lập error_reporting = E_ALL
; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Chú ý: cần khởi động lại Web Server, PHP FPM sau khi sửa đổi php.ini
Thiết lập nhận thông báo lỗi với hàm error_reporting[]
Bạn có thể dùng hàm error_reporting[] để thiết lập các loại lỗi có thể hiện thịerror_reporting[] để thiết lập các loại lỗi có thể hiện thị
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]
Cũng có thể dùng hàm ini_set để thiết lập chỉ thị error_reporting
// Hiện thị E_DEPRECATED và E_STRICT ini_set['error_reporting', E_ALL & ~E_DEPRECATED & ~E_STRICT];
Hàm trigger_error trong PHP, phát sinh thông báo lỗi
Trong code của bạn, tùy logic của ứng dụng, có những thời điểm có thể bạn cần phát đi các lỗi do bạn tự định nghĩa. Lúc đó bạn sử dụng tới phương thức trigger_error
trigger_error[$mgs, $error_level];
; Thiết lập chỉ hiện thị lỗi E_DEPRECATED và E_STRICT ; Môi trường Product nên thiết lập error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
9 dòng thông báo// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]
0 cấp độ lỗi, là một trong các giá trị E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE. Không thiết lập mặc định là E_USER_NOTICEE_USER_ERROR, E_USER_WARNING, E_USER_NOTICE. Không thiết lập mặc định là E_USER_NOTICE
Ví dụ:
Hàm set_error_handler trong PHP, đăng ký error_handler
Bạn có thể đăng ký một hàm callback trở thành error_handler của PHP, tức hàm đó được thực thi khi có lỗi xảy ra. Tuy nhiên các lỗi sau nó không bắt được E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING. Vậy sẽ bắt được các lỗi như: E_USER_*, E_WARNING, E_NOTICE ...E_USER_*, E_WARNING, E_NOTICE ...
Đầu tiên bạn cần xây dựng một hàm callback có các tham số:
// $errno : mã lỗi nhận được // $errstr: chuỗi thông báo lỗi // $errfile: file xảy ra lỗi // $errline: dòng có lỗi // $errcontext: mảng các biến tại thời điểm lỗi handler[$errno, $errstr, $errfile = null, $errline = null, $errcontext = null] : bool
Ví dụ xây dựng một hàm callback như sau:
include ["file-ma-nguon-nay-khong-co.php"];0
Để thiết lập nó là error handler, gọi hàm sau để đăng ký:
include ["file-ma-nguon-nay-khong-co.php"];1
Bạn cũng có thể dùng hàm vô danh làm handler, ví dụ:
include ["file-ma-nguon-nay-khong-co.php"];2
Sau khi đăng ký hàm error-handler mới, nếu muốn quay về trạng thái trước thì dùng hàm restore_error_handler[], hoặc set_error_handler[null] để hủy không sử dụng error handler.restore_error_handler[], hoặc set_error_handler[null] để hủy không sử dụng error handler.
throw và lớp Exception trong PHP
Ngoại lệ là đối tượng chứa thông tin lỗi được phát sinh, bạn có thể tạo ra các ngoại lệ bằng cách tạo đối tượng mới từ bất kỳ lớp nào triển khai từ giao diện Throwable của PHP. Như các lớp
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]1,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]2,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]3,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]4,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]5 ...
Khi có một ngoại lệ, giả sử là đối tượng
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]6, thì trong code bạn có thể phát - lan truyền ngoại lệ đó bằng từ khóa
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]7.
include ["file-ma-nguon-nay-khong-co.php"];3
Khi code thi hành gặp lệnh
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]7 thì khối code đó sẽ dừng tại
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]7
Ví dụ:
include ["file-ma-nguon-nay-khong-co.php"];4
Hàm set_error_handler trong PHP, đăng ký error_handler
include ["file-ma-nguon-nay-khong-co.php"];5
Bạn có thể đăng ký một hàm callback trở thành error_handler của PHP, tức hàm đó được thực thi khi có lỗi xảy ra. Tuy nhiên các lỗi sau nó không bắt được E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING. Vậy sẽ bắt được các lỗi như: E_USER_*, E_WARNING, E_NOTICE ...
Đầu tiên bạn cần xây dựng một hàm callback có các tham số:
Ví dụ xây dựng một hàm callback như sau:try ... catch ...
Để thiết lập nó là error handler, gọi hàm sau để đăng ký:
include ["file-ma-nguon-nay-khong-co.php"];6
Ví dụ:
include ["file-ma-nguon-nay-khong-co.php"];7
Hàm set_error_handler trong PHP, đăng ký error_handler
Bạn có thể đăng ký một hàm callback trở thành error_handler của PHP, tức hàm đó được thực thi khi có lỗi xảy ra. Tuy nhiên các lỗi sau nó không bắt được E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING. Vậy sẽ bắt được các lỗi như: E_USER_*, E_WARNING, E_NOTICE ...
Đầu tiên bạn cần xây dựng một hàm callback có các tham số:
include ["file-ma-nguon-nay-khong-co.php"];8
Ví dụ xây dựng một hàm callback như sau:
Để thiết lập nó là error handler, gọi hàm sau để đăng ký:
include ["file-ma-nguon-nay-khong-co.php"];9
Bạn cũng có thể dùng hàm vô danh làm handler, ví dụ:
Sau khi đăng ký hàm error-handler mới, nếu muốn quay về trạng thái trước thì dùng hàm restore_error_handler[], hoặc set_error_handler[null] để hủy không sử dụng error handler.
echo 'XuanthuLab'0
throw và lớp Exception trong PHP
Ngoại lệ là đối tượng chứa thông tin lỗi được phát sinh, bạn có thể tạo ra các ngoại lệ bằng cách tạo đối tượng mới từ bất kỳ lớp nào triển khai từ giao diện Throwable của PHP. Như các lớp
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]1,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]2,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]3,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]4,
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]5 ...
echo 'XuanthuLab'1
Khi có một ngoại lệ, giả sử là đối tượng
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]6, thì trong code bạn có thể phát - lan truyền ngoại lệ đó bằng từ khóa
// Hiện thị tất cả các lỗi error_reporting[E_ALL]; // Hoặc E_DEPRECATED và E_STRICT error_reporting[E_ALL & ~E_DEPRECATED & ~E_STRICT]7.