Một câu hỏi giả định cho tất cả các bạn nhai ...Tại sao một hàm đệ quy vô hạn trong PHP lại gây ra sự phân đoạn?
Gần đây tôi đã trả lời một câu hỏi khác về kịch bản PHP, và nó nhắc tôi về điều mà tôi luôn thắc mắc. bất kỳ ánh sáng nào trên đó.
xem xét như sau:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
Rõ ràng, (vô dụng) chức năng này lặp vô hạn. Và cuối cùng, sẽ hết bộ nhớ vì mỗi cuộc gọi đến hàm thực thi trước khi hàm trước kết thúc. Sắp xếp giống như một quả bom ngã ba mà không có tiếng còi. Tuy nhiên, cuối cùng, trên nền tảng POSIX, kịch bản sẽ chết với SIGSEGV (nó cũng chết trên Windows, nhưng duyên dáng hơn - cho đến khi các kỹ năng gỡ lỗi cấp thấp cực kỳ hạn chế của tôi có thể cho biết). Số vòng lặp thay đổi tùy thuộc vào cấu hình hệ thống (bộ nhớ được cấp phát cho PHP, 32bit/64bit, v.v.) và hệ điều hành nhưng câu hỏi thực sự của tôi là - tại sao nó lại xảy ra với segfault?
- Đây có phải là cách PHP xử lý các lỗi "hết bộ nhớ" không? Chắc chắn phải có một cách duyên dáng hơn để xử lý điều này?
- Đây có phải là lỗi trong công cụ Zend không?
- Có cách nào điều này có thể được kiểm soát hoặc xử lý một cách duyên dáng hơn từ bên trong tập lệnh PHP không?
- Có bất kỳ cài đặt nào thường kiểm soát số lượng cuộc gọi đệ quy tối đa có thể được thực hiện trong một hàm không?
Phiên bản hiện tại của php (5 iirc) có giới hạn chiều sâu đệ quy để ngăn chặn điều này loại điều. Nếu nó là segfaulting, nó chắc chắn là một lỗi mà nên được báo cáo ... – ircmaxell
[Theo PHP] (https://bugs.php.net/bug.php?id=43187), đây là hành vi dự định. – NullUserException
Nếu bạn đang tìm kiếm một ngôn ngữ có giới hạn đệ quy, hãy thử [Python] (http://docs.python.org/library/sys.html#sys.setrecursionlimit) – NullUserException