2010-08-26 59 views
7

Đến với một thứ gì đó lạ khi di chuyển đến máy chủ mới của tôi.Có khả năng Echo trước tiêu đề()

Tôi có một tập lệnh sẽ chuyển hướng người dùng đến một trang web khác dựa trên các điều kiện nhất định. Những gì tôi đã làm, tuy nhiên, là echoing ra 'Redirecting ...', sau đó sử dụng chức năng header() để thực sự chuyển hướng. Sau đây là cách mã nhìn:

if($condition) { 
    echo 'Redirecting...'; 
    header('Location: ' . $url); 
} 

Bây giờ tôi chỉ nhận thấy rằng đây là không chính xác sau khi chuyển đổi sang máy chủ mới của chúng tôi, thử nghiệm nó ra, và thấy rằng nó sẽ không chuyển hướng chỉ chuyển hướng đầu ra ... và khi tôi tìm kiếm về nó, đã học được bạn không thể có bất kỳ loại đầu ra nào (trừ khi sử dụng ob_start vv) trước khi sử dụng hàm header().

Câu hỏi là, tại sao mã này, KHÔNG nên hoạt động trong BẤT CỨ cài đặt PHP, hoạt động trên máy chủ cũ của tôi? Nó sẽ chuyển hướng với echo trước header() không có vấn đề gì.

Cảm ơn!

+1

Tôi tin rằng bạn có thể bật đệm đầu ra theo mặc định trong php.ini của mình. Phía dưới là toàn bộ yêu cầu phải hoàn thành trước khi bất kỳ đầu ra nào được gửi tới người dùng. – meagar

Trả lời

9

Bạn có thể đã có bộ đệm đầu ra trên máy chủ cũ: đệm đầu ra sẽ không xuất ra bất kỳ điều gì cho đến khi tập lệnh kết thúc chạy. Điều đó cho phép nó để có được tiêu đề ra trước khi đầu ra thực tế (vì nó biết các tiêu đề cần được gửi đầu tiên).

Nếu điều đó có ý nghĩa.

+0

Cảm ơn bạn! mà có vẻ là vấn đề chỉ cần kiểm tra php.ini trên máy chủ cũ và output_buffering được thiết lập để 4096 vì vậy nó đã được trên :) –

1

Nó hoạt động trên máy chủ cũ của bạn vì bạn đã xuất bộ đệm theo mặc định, do php.ini đặt.

+0

Cảm ơn! Tôi đánh giá cao nó! –

4

Có thể cài đặt cũ của bạn có output_buffering được xác định là true trong php.ini. Điều này làm chậm đầu ra cho phép bạn đặt tiêu đề ngay cả sau khi lặp lại.

+0

Cảm ơn! Tôi đánh giá cao nó! –

3

Bạn phải bật chế độ đệm, mặc dù bạn không chủ động làm như vậy. output_buffering = On trong php.ini?

+0

Cảm ơn! Tôi đánh giá cao nó! –

0

Máy chủ cũ có thể đã bật bộ đệm đầu ra theo mặc định. Điều này có nghĩa rằng nó sẽ không echo ngay lập tức, nhưng thay vì chờ đợi cho đến khi toàn bộ kịch bản đã hoàn thành, và sau đó echo. Điều này cũng có nghĩa là tiêu đề sẽ được gửi trước echo (vì nó được đệm), và do đó sẽ không dẫn đến cảnh báo. Trên máy chủ mới, rất có thể bạn không có bộ đệm đầu ra được kích hoạt theo mặc định và điều này có nghĩa là nó sẽ có nghĩa là echo ngay lập tức, không đệm nó và do đó nó sẽ được gửi trước tiêu đề và dẫn đến cảnh báo .

Tôi sẽ khuyến khích bạn sử dụng headers_sent() để kiểm tra xem các tiêu đề đã được gửi đi trước khi sử dụng headers() sau echo, như thế này:

<?php 
echo "Foobar\n"; 
if(!headers_sent()) 
    header('Location: /helloworld.php'); 
?> 

liên kết liên quan:

+0

Cảm ơn sự giúp đỡ tôi đánh giá cao nó :) –

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