2013-03-10 42 views
6

Tôi có một tập lệnh chạy trong khoảng 1 giờ. Tôi có 2 máy chủ web, một trong số đó, tôi có thể xem kết quả trong thời gian thực, (nó lặp lại hàng triệu lần và lặp lại nội dung) trong khi trên webhost khác, tôi phải chờ cho đến khi kịch bản kết thúc chạy trước khi tôi thấy bất kỳ đầu ra nào ở tất cả.Hiển thị đầu ra PHP liên tục?

Làm cách nào để thay đổi cài đặt để hiển thị kết quả trong thời gian thực? Tôi đoán đây là một điều php.ini.

Thêm mã: Mã này sẽ xuất trong khi thực hiện trong máy chủ đầu tiên, nhưng không xuất hiện trong máy chủ thứ hai. Thông tin bổ sung, nếu tôi đặt giá trị thấp hơn 1015, máy chủ đầu tiên đợi với xuất ra. Vì vậy, có vẻ như máy chủ đầu tiên của tôi là đỏ bừng mỗi 1015 ký tự, trong khi thứ hai thì không.

while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    } 
    echo "<br><br>\n"; 
    sleep(1); 
} 

Trên máy chủ thứ hai của tôi, bộ đệm đầu ra bị tắt và tôi đã thử bật ngầm khi không có kết quả.

Trả lời

2

Thử gọi flush theo định kỳ. Nếu bạn đang sử dụng output buffering, bạn có thể muốn tắt tính năng này bằng một chuỗi ob_end_flush hoặc sử dụng ob_flush.

+0

gì làm việc trên máy chủ thứ hai của tôi. tôi đoán máy chủ đang ghi đè một số cài đặt. –

6

Điều này liên quan đến bộ đệm đầu ra. Nếu đầu ra đệm được bật, đầu ra không được gửi đến máy khách ngay lập tức nhưng sẽ đợi cho đến khi một lượng dữ liệu nhất định được đệm. Điều này thường làm tăng hiệu suất nhưng sẽ gây ra vấn đề như của bạn.

Giải pháp đơn giản không đòi hỏi thay đổi bất kỳ php.ini cài đặt, nhưng chỉ cần đặt này vào đầu script của bạn:

<?php 
    while (@ob_end_flush()); 
?> 

này sẽ tuôn và vô hiệu hóa tất cả các bộ đệm đầu ra cùng một lúc.

(Nguồn: http://www.php.net/manual/en/function.ob-end-flush.php#example-460)

Bạn cũng có thể muốn đọc hướng dẫn PHP trên Output Control. Các cài đặt php.ini có liên quan được liệt kê here.

Nếu bạn muốn đảm bảo mọi thứ đang được gửi (tức là trước một tác vụ tốn thời gian), hãy gọi flush() vào thời điểm thích hợp.


Edit:

Trong trình duyệt thực tế có thể có bộ đệm riêng của họ, đặc biệt là khi Content-Type không rõ ràng set (trình duyệt cần phải sniff các định dạng MIME của tập tin). Nếu trường hợp này xảy ra, bạn không thể kiểm soát hành vi của trình duyệt.

Một cách có thể giải quyết nó là để thiết lập một cách rõ ràng Content-Type:

header("Content-Type: text/plain"); // if you don't need HTML 
// OR 
header("Content-Type: text/html"); 

Nhưng đây là không được bảo đảm để làm việc. Nó hoạt động trên Firefox của tôi nhưng không hoạt động trên Chrome.

Dù sao, mã cuối cùng của bạn sẽ giống như thế:

header("Content-Type: text/html"); // Set Content-Type 
while (@ob_end_flush()); // Flush and disable output buffers 
while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    //flush(); // In fact because there is no significant delay, you should not flush here. 
    } 
    echo "<br><br>\n"; 
    flush(); // Flush output 
    sleep(1); 
} 
+0

đoán tôi cần php.ini stuff, đỏ bừng không làm gì cho tôi trên máy chủ đó. –

+0

@KristianRafteseth Các trình duyệt web cũng có thể có bộ đệm riêng của chúng, do đó, điều này có thể không phải lúc nào cũng là vấn đề phía máy chủ. –

+0

nhưng sử dụng cùng một tập lệnh và cùng một phiên trong cùng một trình duyệt và chạy cả hai tập lệnh cùng một lúc, trên các máy chủ khác nhau. và một hiển thị đầu ra ngay lập tức, các khác không. –

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