2008-10-19 21 views
11

Giả sử bạn có một dự án PHP lớn và đột nhiên, khi cố gắng chạy nó, bạn chỉ cần kết thúc với một trang trống. Kịch bản lệnh chấm dứt và bạn muốn tìm chính xác vị trí đó với nỗ lực ít nhất có thể.Cách nhanh nhất để xác định nơi tập lệnh PHP thoát

Có công cụ/chương trình/lệnh/IDE có thể, khi chấm dứt tập lệnh PHP, cho bạn biết vị trí của thoát tập lệnh không?

Lưu ý: Tôi không thể đánh dấu bài đăng của riêng mình là "câu trả lời được chấp nhận" nên hãy nhìn vào phần dưới cùng để xem giải pháp của tôi. Nếu bạn nghĩ ra giải pháp tốt hơn, tôi sẽ đánh dấu bài đăng của bạn là câu trả lời.

+0

Trong tương lai hãy đảm bảo rằng die() với thư ;-) – Ross

+0

Vâng ... đó thường là ý tưởng hay, hoặc sử dụng xử lý ngoại lệ. Làm việc rất nhiều với mã tôi không viết bản thân mình mặc dù ...x/ –

Trả lời

3

Với một số cảm hứng từ nonworking nhưng vẫn trả lời đúng hướng từ RoBorg, tôi đã sử dụng đoạn mã sau vào đầu:

function shutdown() { 
    global $dbg_stack_a; 
    print_r($dbg_stack_a); 
} 
register_shutdown_function('shutdown'); 

Và sau đó tôi đã thực hiện một breakpoint có điều kiện toàn cầu (breakpoint toàn cầu = được đánh giá trên mỗi hàng), khai thác thực tế là nó có thể chạy mã máng eval(), với "điều kiện" sau đây:

eval(' 
global $dbg_stack_a, $dbg_stack_b, $dbg_stack_c; 
$dbg_stack_a = $dbg_stack_b; 
$dbg_stack_b = $dbg_stack_c; 
$dbg_stack_c = debug_backtrace(); 
return false; 
') 

Có lẽ không nhanh nhưng không phải là lừa! Sử dụng điều này tôi đã có thể xác định chính xác các tập tin và vị trí đường dây lớn lên chết(). (Ví dụ này hoạt động trong NuSphere.)

0
grep -n die filename 
+0

Câu trả lời hay, nhưng tôi đang tìm một giải pháp tổng quát (đối với bất kỳ loại lối ra nào), và không chỉ tìm ra die(). Cũng giả sử rằng dự án có nhiều chết và thoát ra và tìm kiếm máng tất cả sẽ là một nhiệm vụ tẻ nhạt cực kỳ. –

0

Đừng quên grep để "thoát" nữa.

0

Thêm phần này vào phía trên cùng của file:

function shutdown() 
{ 
    print_r(debug_backtrace()); 
} 


register_shutdown_function('shutdown'); 

Xem register_ shutdown_function()

+5

Không hoạt động. Chức năng tắt máy xảy ra sau khi ngăn xếp đã được giải phóng. Không có thông tin ngăn xếp để đổ. – troelskn

+1

Vâng, đây sẽ là chính xác những gì tôi đang tìm kiếm, nếu PHP không xóa dấu vết ngăn xếp trước khi gọi nó ... –

0

Bạn có thể sử dụng một trình gỡ lỗi tương tác để bước qua mã cho đến khi bạn đạt đến điểm thoát. Khác hơn thế, tôi nghĩ rằng bạn đang grep'ing mã cho exit|die.

0

xdebug có tính năng theo dõi tốt đẹp sẽ cho phép bạn xem toàn bộ dấu vết của việc thực thi ứng dụng php của bạn và nó sẽ cung cấp cho bạn đầu mối về vị trí thoát của bạn.

nhưng đối với giải pháp nhanh và bẩn, grep/find như đã đề cập ở trên sẽ làm đúng.

0

Cũng kiểm tra error___logs cho lỗi "memory_limit" trong Apache error_log.

Memory Giới hạn> = 10M Cảnh báo: (Set này để 10M hoặc lớn hơn trong tập tin php.ini của bạn)

Theo kinh nghiệm của tôi, kịch bản bất ngờ kết thúc mà không cảnh báo hoặc thông báo khi điều này xảy ra.

0

Đảm bảo rằng các lỗi được hiển thị trong môi trường phát triển của bạn (không phải sản xuất).

8

Tôi sử dụng mã sau và không cần môi trường gỡ lỗi đặc biệt. Lưu ý rằng điều này có thể mất nhiều thời gian; bạn có thể đặt số lượng bọ đếm cao hơn - làm cho nó nhanh hơn, nhưng bị mờ.

function shutdown_find_exit() 
{ 
    var_dump($GLOBALS['dbg_stack']); 
} 
register_shutdown_function('shutdown_find_exit'); 
function write_dbg_stack() 
{ 
    $GLOBALS['dbg_stack'] = debug_backtrace(); 
} 
register_tick_function('write_dbg_stack'); 
declare(ticks=1); 
Các vấn đề liên quan