Có cách nào trong PHP để bẫy lỗi nghiêm trọng khi đạt đến thời gian thực hiện tối đa và cung cấp cho người dùng một thông điệp tốt hơn không?Lỗi bẫy thời gian thực thi tối đa Php bẫy
Trả lời
Hãy thử thiết lập một "Done" cờ sau khi thực hiện một tập tin và đăng ký một hàm shutdown mà sẽ kiểm tra xem cờ đó có được định nghĩa là
Câu trả lời gốc của tôi sẽ không hoạt động vì bạn không thể gặp phải lỗi nghiêm trọng. Nếu bạn vẫn muốn đọc, hãy kiểm tra lịch sử sửa đổi.
Đoán duy nhất của tôi là bạn có thể sử dụng register_shutdown_function
. Đặt biến ở đầu tập lệnh, xóa biến khi tập lệnh đã hoàn tất thành công. Viết một hàm để kiểm tra rằng biến và tác động lên nó nếu nó vẫn được thiết lập, sau đó áp dụng các chức năng sử dụng register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
Sau khi đọc hai câu trả lời đầu tiên ở đây, tôi phải tự mình kiểm tra register_shutdown_function()
- tôi không nghĩ nó sẽ chạy. Sau khi tất cả, làm thế nào có thể một chức năng người dùng chạy một khi không có nhiều bộ nhớ hơn, hoặc thời gian thực hiện đã trôi qua? Tôi đã rất ngạc nhiên khi biết rằng các chức năng tắt máy làm chạy, ngay cả trong tình huống OOM hoặc khi thời gian thực hiện đã được xử lý. Bằng chứng về khái niệm:
Để kiểm tra giới hạn bộ nhớ:
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
ini_set('memory_limit', '1000');
$x = '';
while(true) {
$x .= 'lkajsdlfkjasldkfjlaskdfjasldkfj';
}
Output:
PHP Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
Call Stack:
0.0002 81360 1. {main}() /home/scratch.php:0
omg
Để kiểm tra thời gian thực hiện:
cat scratch.php
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
set_time_limit(1);
while(true) {}
Output:
PHP Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
Call Stack:
0.0002 80200 1. {main}() /home/scratch.php:0
omg
Lưu ý rằng, để thông báo của bạn hiển thị trước khi xuất hiện lỗi của PHP, bạn phải tắt hoàn toàn đầu ra lỗi của PHP. Phương pháp nào là tốt nhất cho một trang web sản xuất.
Đã đạt đến thời gian thực hiện tối đa! = Bộ nhớ đã cho phép hết Thật khó để thực hiện kịch bản đạt thời gian thực hiện tối đa bằng các vòng lặp và chức năng ngủ, chế độ ngủ đóng băng thời gian thực hiện ... – shfx
. Chỉnh sửa bài đăng để kiểm tra giới hạn thời gian thực thi thay vì hết bộ nhớ –
Nếu không có cách nào để bẫy lỗi từ cấp API, công cụ PHP sẽ có thể đổ bộ nhớ trên hdd bất cứ khi nào xảy ra lỗi nghiêm trọng, giống như những gì Windows thực hiện khi bạn nhìn thấy 'màn hình xanh'.
chỉ cần đánh bại tôi với nó - tôi đã viết lại câu trả lời của mình dọc theo các dòng này –
;) Thật tuyệt, Câu trả lời của bạn chính xác hơn – shfx
Cảm ơn! Điều đó đã làm các trick. – AdamA