2012-08-05 41 views
8

Tôi đang cố gắng làm quen với hàm flush() của PHP cho một dự án tôi đang làm, tôi đã tự viết một vài kịch bản và tải chúng lên một số không gian web mà tôi sở hữu; nhưng có vẻ như không ai trong số họ làm việc. Tôi đã chọn phần dưới đây từ một bình luận trên PHP.net và đã thử nó:PHP flush() dường như hoạt động trên máy Linux của tôi nhưng không hoạt động trên máy tính của tôi?

<?php 
header('Content-type: text/html; charset=utf-8'); 

echo 'Begin ...<br />'; 
for($i = 0 ; $i < 10 ; $i++) 
{ 
    echo $i . '<br />'; 
    flush(); 
    sleep(1); 
} 
echo 'End ...<br />'; 

Dường như tập lệnh STILL không hoạt động.

sau đó tôi đọc một bình luận nói rằng:

Nếu bạn gọi ob_flush() và flush() và vẫn không nhận được bộ đệm đỏ mặt nó có thể là do một số phần mềm chống virus (Panda trong trường hợp này) giữ bộ đệm cho đến khi trang tải xong trước khi gửi đến trình duyệt.

Vì vậy, tôi quyết định yêu cầu trang web trên máy tôi đã sử dụng Linux (Ubuntu 12.04) vì không cài đặt bất kỳ phần mềm diệt vi-rút nào; và nó hoạt động hoàn hảo!

Tôi không biết điều này có liên quan gì đến phần mềm chống vi-rút không? Hoặc một số cơ chế lạ khác trong Windows đang ngăn ngừa flush() từ việc đạt được mục đích, tôi đang sử dụng cùng một trình duyệt trên cả hai máy (Firefox 14.0.1) vì vậy tôi nghi ngờ nó có thể là vậy. Vì vậy, tôi đoán câu hỏi thực sự của tôi là: Không ai biết bất cứ điều gì về phần mềm chống virus ngăn ngừa tuôn ra() từ việc đạt được mục đích của nó (vì tôi dường như không thể tìm thấy bất cứ điều gì về nó trực tuyến)? Và nếu có, có cách nào để vượt qua nó không? EDIT: Chỉ cần để làm sáng tỏ, tôi tích cực này không phải là phía máy chủ, tôi có một máy chủ web bên ngoài chạy Linux, tôi không lưu trữ các kịch bản tại địa phương trên một trong hai máy Linux hoặc Windows.

EDIT2: Tôi đã thử điều này xung quanh một nhà bạn bè trên máy tính xách tay Linux mà tôi quản lý để làm cho nó hoạt động tại nhà của tôi, kỳ lạ mã tuôn ra cũng không làm việc tại nhà của họ (thay vì nó chỉ mất lứa tuổi để tải và tất cả đều xuất hiện cùng lúc) điều này lạ khi nó hoạt động trên máy tính xách tay này trong nhà của tôi, tôi không chắc liệu các router có liên quan đến chức năng flush() hay không.) bởi vì đó là điều duy nhất tôi có thể nghĩ về điều đó có thể can thiệp vào nó.

Nếu không, tôi đã không tiến triển cố gắng để giải quyết vấn đề này, điều này chắc chắn không liên quan đến kết thúc của máy chủ, điều này là lạ vì hầu hết thông tin tôi tìm thấy đang nói về máy chủ là vấn đề khi hàm flush() không hoạt động:/

Thật trùng hợp tôi cũng đã thử trên máy tính chạy Norton (thay vì AVG) tại nhà tôi, nó hoạt động nhưng không hoàn toàn 100%.

Trả lời

4

Có một số thứ có thể ngăn chặn đầu ra từ được hiển thị ngay lập tức, bao gồm:

  • Buffering từ bên trong PHP (đó là những gì flush ngăn chặn)
  • Buffering để tích lũy đủ dữ liệu để nén (khi nén được kích hoạt)
  • Đệm tại máy chủ web (có thể quyết định làm như vậy vì bất kỳ lý do gì)
  • Đệm bên trong trình duyệt (trình duyệt sử dụng các kỹ thuật khác nhau để tải trang "cảm thấy nhanh" đến cuối người dùng; các kỹ thuật này bao gồm không phải lúc nào cũng hiển thị nội dung ngay khi có sẵn)

Vì không thể đảm bảo rằng chương trình của bạn sẽ hoạt động như bạn mong đợi.

Tất cả điều này được nhắc đến trong các ghi chú cho flush:

sẽ xóa bộ đệm ghi của PHP và bất cứ điều gì phụ trợ PHP đang sử dụng (CGI, một máy chủ web, vv). Điều này cố gắng để đẩy đầu ra hiện tại tất cả các cách để trình duyệt với một vài cảnh báo.

flush() có thể không ghi đè lên sơ đồ đệm của máy chủ web của bạn và nó không ảnh hưởng đến bất kỳ bộ đệm phía máy khách nào trong trình duyệt . Nó cũng không ảnh hưởng đến bộ đệm đầu ra của không gian người dùng của PHP . Điều này có nghĩa là bạn sẽ phải gọi cả ob_flush() và flush() để xóa bộ đệm đầu ra ob nếu bạn đang sử dụng chúng.

Một số máy chủ, đặc biệt là trên Win32, vẫn sẽ đệm đầu ra từ kịch bản của bạn cho đến khi nó kết thúc trước khi truyền tải những kết quả cho trình duyệt.

Mô-đun máy chủ cho Apache như mod_gzip có thể tự lưu vào bộ đệm của máy sẽ gây ra flush() để không gửi dữ liệu được gửi ngay cho khách hàng.

Ngay cả khi trình duyệt có thể lưu dữ liệu vào trước khi hiển thị nó. Netscape, ví dụ, đệm văn bản cho đến khi nó nhận được một dòng cuối cùng của dòng hoặc bắt đầu một thẻ và nó sẽ không hiển thị các bảng cho đến khi thẻ của bảng ngoài cùng được nhìn thấy.

Một số phiên bản Microsoft Internet Explorer sẽ chỉ bắt đầu hiển thị trang sau khi chúng nhận được 256 byte đầu ra, vì vậy bạn có thể cần phải gửi khoảng trắng thừa trước khi xả để có được những trình duyệt này hiển thị trang.

+0

Tôi biết điều này chắc chắn là phía máy khách và không phải phía máy chủ, mặc dù trang đó hoạt động hoàn hảo khi được hiển thị trong Firefox trong Linux, nhưng không ổn trong Windows. Điều này khiến tôi nghĩ đây không phải là vấn đề liên quan đến trình duyệt. . . dường như loại bỏ tất cả các giải thích trong câu nói đó:/ – Sean

+0

@SeanDunwoody: Làm sao bạn biết nó không phải là phía máy chủ? Máy chủ là một chương trình khác nhau theo từng hệ điều hành. Cũng vậy với trình duyệt. – Jon

+0

Không, xin lỗi tôi nghĩ rằng bạn hiểu sai, tôi có một máy chủ lưu trữ này chạy Linux, tôi không lưu trữ địa phương này trên máy hoặc – Sean

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