2010-11-16 14 views
61

Sự khác biệt giữa ob_flush()flush() là gì và tại sao tôi phải gọi cả hai?PHP buffer ob_flush() so với flush()

Các ob_flush() reference nói:

Chức năng này sẽ gửi các nội dung của bộ đệm đầu ra (nếu có).

Các flush() reference nói:

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).

Tuy nhiên, nó vẫn tiếp tục nói:

[nó] có thể không có thể ghi đè chương trình đệm của máy chủ web của bạn ...

Vì vậy, dường như với tôi rằng tôi có thể chỉ cần sử dụng ob_flush() mọi lúc. Tuy nhiên, tôi nhận được kết quả lạ khi tôi làm điều đó. Ai đó có thể giải thích một cách đơn giản những gì đang xảy ra ở đây?

Trả lời

62

ob_flush gửi bộ đệm do ứng dụng khởi tạo. Có thể có nhiều tập hợp lồng nhau ob_start() trong bất kỳ tập lệnh PHP nào. ob_flush chuyển nội dung hiện tại lên lớp trên.

Bản thân PHP có thể (theo ý riêng của mình) đầu ra bộ đệm. Điều này phụ thuộc vào back-end. Nhưng thông thường, FastCGI có bộ đệm ổ cắm. Do đó, flush() cũng cần phải được gọi để gửi nội dung hiện tại tới máy chủ web.

Và bây giờ, máy chủ web có thể tự thực hiện một lược đồ đệm khác (mod_deflate hoặc bộ lọc nội dung) mà bạn không có ảnh hưởng. Nhưng điều này là hiếm khi, vì nó cần phải được cấu hình đặc biệt.

Dù sao, hãy sử dụng cả hai.

+6

Sử dụng ob_flush và tuôn ra và sử dụng chúng theo thứ tự đó. – Robino

+12

Các chi tiết quan trọng còn thiếu trong câu trả lời này là tùy chọn cấu hình ['output_buffering'] (http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering), có giá trị mặc định trong sản xuất Các phiên bản của php.ini là 4096. Điều đó có nghĩa là khi bất kỳ tập lệnh PHP nào bắt đầu, 4096 byte đầu ra đầu tiên sẽ được đệm (trong bộ đệm có thể xóa được bằng 'ob_flush()'). Đây là lý do tại sao nó là cần thiết để sử dụng 'ob_flush()' cũng như 'flush()'. Vô hiệu hóa 'output_buffering' thông qua php.ini hoặc gọi' ob_end_clean() 'hoặc' ob_end_flush() 'ở đầu tập lệnh sẽ loại bỏ sự cần thiết này. –

26

ob_flush flushes bộ đệm đầu ra bạn tạo với một chức năng như ob_start

flush bừng đệm đầu ra của kịch bản PHP bản thân để người gọi nó

10

Tôi đoán đây là liên quan đến previous question của bạn. Lợi thế đáng kể của việc sử dụng bộ đệm đầu ra là khi nó được sử dụng cùng với việc nén dữ liệu. Nếu bạn không sử dụng ob_gzhandler, có rất ít để đạt được. flush một mình sẽ chỉ cam kết bất kỳ dữ liệu đầu ra nào vẫn còn trên máy chủ. Với ob_start và các đối tác của nó ob_flush, ob_end_cleanob_end_flush, bất cứ điều gì đang chờ đợi để được nén (nhìn vào flushob_flush như đề cập đến xô khác nhau - ob gửi dữ liệu đến flush, flush gửi dữ liệu đến trình duyệt - có thể không chính xác nhưng đó là ý tưởng) sẽ được gói và gửi cho khách hàng.

+0

Cảm ơn, sự tương đồng của nhóm là một ví dụ hay. – Ben

18

ob_flush() là mức xả cao cấp. Nó xóa bộ đệm cấp cao và đặt tất cả nội dung trong bộ đệm nội bộ cấp thấp sẵn sàng để gửi.

  • Lưu ý rằng các gia đình ob_ chức năng tạo ngăn xếp bộ đệm, vì vậy chỉ cần một cách mù quáng viết ob_flush() ở khắp mọi nơi thực sự sẽ cung cấp cho bạn "Kết quả kỳ lạ" nếu mã đã được viết để tận dụng xếp chồng này.

flush() là mức xả thấp, hướng dẫn PHP xóa bộ đệm dữ liệu nội bộ, cấp thấp.

Dưới đây vẫn sẽ có bộ đệm lớp ổ cắm; dưới đây, có các bộ đệm tầng mạng. Và, ở mức thấp nhất, hàng đợi các electron đi xuống cáp dữ liệu.