2010-09-12 38 views

Trả lời

22

?. Giá trị là 5.

Bạn có thể xuất nhiều tiêu đề hơn chỉ với các tiêu đề Location với header, hầu hết trong số đó bạn không muốn ngừng thực thi mã. Nếu bạn muốn ngừng thực thi mã, bạn cần gọi exit rõ ràng.

+0

die() có cùng tác dụng. –

2

tất nhiên 5. Bạn phải thêm exit() sau khi một tiêu đề như vậy là những gì

2

Lệnh header không làm gián đoạn luồng mã của bạn. Ngay cả khi điều đó gặp phải, trang của bạn vẫn được trình duyệt tải xuống, ngay cả khi trang đó không hiển thị. Xem xét các trang 404, mà (mặc dù là lỗi) vẫn được xử lý bởi trình duyệt (mặc dù chúng được hiển thị trong khi chuyển hướng không được).

3

Khi bạn phát hành tiêu đề, bạn đã bắt đầu cuộc đua giữa mã của bạn và máy chủ web/trình duyệt. Nói chung, ngay sau khi trình duyệt nhận được chuyển hướng, nó sẽ đóng kết nối chạy tập lệnh và bắt đầu kết nối với URL chuyển hướng mới. Khi kết nối bị đóng, máy chủ web nói chung sẽ cố gắng tiêu diệt tập lệnh.

Bạn có thể may mắn và có thể kết thúc bất kỳ điều gì khác mà bạn muốn làm, hoặc bạn có thể không may mắn và kịch bản thậm chí sẽ không thể tiếp cận dòng tiếp theo sau cuộc gọi header().

Có chức năng ignore_user_abort(), điều này sẽ cho phép tập lệnh của bạn tiếp tục bất kể trạng thái của kết nối là gì.

+1

Không, nó vẫn tải xuống toàn bộ phản hồi, ngay cả khi nó có tiêu đề vị trí. Đó là lý do tại sao bạn cần gọi 'exit;' sau tiêu đề nếu bạn muốn nó chuyển hướng mà không cần thực thi thêm bất kỳ mã nào. Nếu nó là ngẫu nhiên hay không nó thực hiện các mã còn lại thì đó sẽ không phải là một tính năng rất hữu ích, phải không? –

+0

nó sẽ không phải là một tính năng. nó sẽ chỉ là một lỗi nhỏ buồn cười để nhắc nhở bạn rằng các trình duyệt hoạt động theo cách đó. tất nhiên là không. – muhmuhten

+0

@TorValamo Tôi không chắc nó hoàn toàn chính xác. Tôi đã làm việc trên một dự án mà tôi đặt tiêu đề vị trí mà không thoát ra sau đó, và cục bộ, mã sau đó không thực thi, trong khi khi nó được đẩy tới máy chủ dev để kiểm tra mã đang được thực thi! – billyonecan

4

Bạn nên luôn luôn chết() hoặc thoát() sau khi chuyển hướng (hoặc như được chỉ ra bởi Mark B, sử dụng ignore_user_abort()) vì bạn không thể biết chắc chắn điều gì sẽ xảy ra.

Mặc dù một số mã sẽ được thực thi sau khi chuyển hướng vị trí tiêu đề, điều quan trọng cần lưu ý là không phải tất cả mã sau khi mã sẽ nhất thiết được thực hiện.

Theo ví dụ của bạn, có, some_value sẽ bằng 5. Nhưng tại một số điểm, tập lệnh sẽ bị chấm dứt sớm.

Lấy ví dụ sau đây:

session_start(); 
$_SESSION["some_value"] = 'original value'; 
header("Location: /index.php/test2"); 

$start_time = microtime(true); 

for($i = 0; $i <= 100000; $i ++) 
{ 
    password_hash($i); // slow it down 
    $_SESSION["some_value"] = $i; 
    $_SESSION['time'] = microtime(true) - $start_time; 
} 

$_SESSION['some_value'] = 'finished!'; 

Nếu tất cả các câu trả lời khác là đúng, bạn sẽ giả định $ _SESSION [ 'some_value'] sẽ bằng 'xong!' - nhưng tôi đã chạy mã và đây không phải là trường hợp.

Dưới đây là kết quả của tôi:

some_value: 174 
time: 0.0026998519897461 

Trial hai:

some_value: 218 
time: 0.0033109188079834 

Trial ba:

some_value: 218 
time: 0.0035371780395508 

Trial bốn:

some_value: 174 
time: 0.0026431083679199 

Dùng thử năm:

some_value: 174 
time: 0.0027921199798584 

Nếu tôi triển khai ignore_user_abort (TRUE); trong kịch bản trên thì some_value không bằng "hoàn thành!" vì vậy hãy ghi nhớ điều đó nếu bạn dự định làm điều gì đó quan trọng như đăng nhập hoặc truy vấn cơ sở dữ liệu hoặc gửi email sau khi chuyển hướng.

Các vấn đề liên quan