Hướng dẫn php output buffering not working - bộ đệm đầu ra php không hoạt động

Tôi có một tập lệnh dài và muốn sử dụng bộ đệm đầu ra để gửi đầu ra đến trình duyệt theo định kỳ.

Tôi bối rối, bởi vì tôi đã đọc một số câu hỏi ở đây cho biết sử dụng điều này:

while (...) {
    ob_start();
    // echo statements
    ob_end_flush();
}

Nhưng điều đó không hiệu quả với tôi. Tôi cũng đã thử điều này:

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}

Nhưng điều đó cũng không hoạt động. Điều duy nhất có vẻ hoạt động là:

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}

Tại sao tôi phải gọi

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
4 trước tiên để bộ đệm đầu ra hoạt động?

Hỏi ngày 24 tháng 7 năm 2014 lúc 5:47Jul 24, 2014 at 5:47

Hướng dẫn php output buffering not working - bộ đệm đầu ra php không hoạt động

Có lẽ nó phụ thuộc vào phần còn lại của mã của bạn.

Đối với tôi mã sau hoạt động mà không có vấn đề:

";
    ob_flush();
    flush();
    sleep(1);
    ++$x;
}

Bạn có thể sử dụng

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
5 nhưng nó khiến bạn không cần phải chạy
while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
6 mỗi khi bạn chạy
while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
7 để có thể thay đổi mã trên:

";
    ob_flush();    
    sleep(1);
    ++$x;
}

Bạn cũng nên nhìn vào

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
8 của bạn. Nếu trong bất kỳ mã nào ở trên, tôi xóa/nhận xét dòng với tiêu đề, tất cả nội dung sẽ được hiển thị sau khi tập lệnh kết thúc thực thi. Bộ đệm đầu ra sẽ không hoạt động như mong đợi

Đã trả lời ngày 24 tháng 7 năm 2014 lúc 6:12Jul 24, 2014 at 6:12

Hướng dẫn php output buffering not working - bộ đệm đầu ra php không hoạt động

Marcin Nabiałekmarcin NabiałekMarcin Nabiałek

107K41 Huy hiệu vàng249 Huy hiệu bạc290 Huy hiệu Đồng41 gold badges249 silver badges290 bronze badges

1

Bạn làm điều đó sai cách. Điều này sẽ làm điều đó:

while (...) {
    // echo statements
    flush();
}

Hãy chắc chắn rằng, máy chủ web của bạn được cấu hình để ủy thác đầu ra mà không cần bộ đệm riêng. Bộ đệm đầu ra

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
9 chỉ cần thiết, nếu bạn muốn lấy đầu ra sau dưới dạng chuỗi.

Ngoài ra, hãy xem

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}
0, sẽ tự động thực hiện đầu ra.

Đã trả lời ngày 24 tháng 7 năm 2014 lúc 5:58Jul 24, 2014 at 5:58

Hướng dẫn php output buffering not working - bộ đệm đầu ra php không hoạt động

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}
1

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}
2

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}
3

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}
4

Đầu ra không được đệm theo mặc định với PHP và nội dung của tập lệnh được gửi đến trình duyệt trong các khối khi nó được tạo. Bộ đệm chức năng bộ đệm đầu ra của PHP, Bộ đệm cung cấp đầu ra khi nội dung được gửi, cho phép nó được nén và cho phép hỗn hợp các tiêu đề và nội dung được mã hóa mà không nhận được những thông tin "không thể sửa đổi thông tin tiêu đề - các tiêu đề đã được gửi".

Không thể sửa đổi thông tin tiêu đề - các tiêu đề đã được gửi

Thông báo lỗi trên được hiển thị khi một số nội dung đã được gửi đến trình duyệt web và sau đó một tiêu đề được đặt, chẳng hạn như đặt cookie, thực hiện chuyển hướng trang, v.v. Các tiêu đề phải được đặt trước khi gửi bất kỳ nội dung nào là lý do cho lỗi.

Mặc dù thực tế tốt nhất là đảm bảo tất cả các tiêu đề tại SET trước khi gửi bất kỳ nội dung nào, nhưng đôi khi có thể đơn giản hơn khi chỉ sử dụng bộ đệm đầu ra sẽ loại bỏ thông báo lỗi. Khi bộ đệm đầu ra được bật, tất cả các tiêu đề sẽ được gửi nhưng nội dung sẽ chỉ được gửi ở cuối tập lệnh hoặc khi tập lệnh được thực hiện rõ ràng.

Cách bật bộ đệm đầu ra

Để bật bộ đệm đầu ra, chỉ cần thêm phần sau vào đầu tập lệnh PHP:

ob_start();

Để cho phép nén GZIP để làm cho nội dung trang nhỏ hơn, hãy làm điều này:

ob_start("ob_gzhandler");

Lưu ý rằng nếu gzhandler đang được sử dụng, thì việc sử dụng bất kỳ chức năng đệm nào khác như trong các ví dụ dưới đây có thể đã giành được công việc như mong đợi và có thể gây ra các vấn đề với trình duyệt hiển thị trang.

Không có gì cần phải được thực hiện trong kịch bản sau khi thực hiện một trong hai cuộc gọi chức năng ở trên; Khi nó đến bộ đệm kết thúc hoàn tất và toàn bộ nội dung được gửi đến trình duyệt dưới dạng văn bản đơn giản hoặc GZIP được mã hóa với các tiêu đề thích hợp.

Làm trống bộ đệm đầu ra

Để làm trống các nội dung hiện tại của bộ đệm đầu ra, hãy làm điều này:

ob_end_clean()

Nhận nội dung của bộ đệm đầu ra

Có thể lấy nội dung của bộ đệm đầu ra dưới dạng chuỗi và làm một cái gì đó với nó, chẳng hạn như lưu nó vào một tệp, gửi nó dưới dạng email, đăng nhập nó, v.v. Một số chức năng PHP lặp lại đầu ra thay vì trả về nó dưới dạng chuỗi và đôi khi có thể hữu ích khi sử dụng bộ đệm đầu ra để có được nội dung này.

Ví dụ đầu tiên dưới đây sẽ nhận được nội dung và trả lại vào biến nội dung $. Bộ đệm hiện tại không bị ảnh hưởng bởi cuộc gọi chức năng này:

$content = ob_get_contents();

Ví dụ thứ hai có được nội dung nhưng làm trống bộ đệm, loại bỏ nội dung khỏi nó:

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
0

Rõ ràng xả bộ đệm

Bộ đệm có thể được xả rõ ràng bất cứ lúc nào bằng cách sử dụng một trong một số chức năng.

Ví dụ đầu tiên bên dưới xóa bộ đệm bằng cách gửi nội dung được đệm đến trình duyệt và làm trống bộ đệm. Bất kỳ đầu ra nữa sẽ tiếp tục được đệm.

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
1

Ví dụ thứ hai xả bộ đệm bằng cách gửi nội dung đến trình duyệt, làm trống bộ đệm và không còn đệm. Bất kỳ nội dung nào được gửi trực tiếp đến trình duyệt.

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
2

Ví dụ cuối cùng xóa đầu ra vào trình duyệt giống như ob_end_flush () và cũng trả về nó dưới dạng chuỗi:

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}
3

đọc thêm

Hãy chắc chắn đọc hướng dẫn sử dụng PHP để biết thêm các ví dụ và chức năng đệm đầu ra. Các ý kiến ​​của người dùng trên nhiều trang tham chiếu chức năng rất hữu ích.

Bộ đệm đầu ra PHP là gì?

Bộ đệm đầu ra là một cơ chế để kiểm soát số lượng dữ liệu đầu ra (không bao gồm các tiêu đề và cookie) PHP nên giữ nội bộ trước khi đẩy dữ liệu đó đến máy khách.Nếu đầu ra của ứng dụng của bạn vượt quá cài đặt này, PHP sẽ gửi dữ liệu đó theo các khối có kích thước gần như kích thước bạn chỉ định.a mechanism for controlling how much output data (excluding headers and cookies) PHP should keep internally before pushing that data to the client. If your application's output exceeds this setting, PHP will send that data in chunks of roughly the size you specify.

OB_flush trong PHP là gì?

Hàm ob_flush () đầu ra các nội dung của bộ đệm đầu ra cao nhất và sau đó xóa bộ đệm của nội dung.Đầu ra có thể bị bắt bởi một bộ đệm đầu ra khác hoặc, nếu không có bộ đệm đầu ra khác, được gửi trực tiếp đến trình duyệt.outputs the contents of the topmost output buffer and then clears the buffer of the contents. The output may be caught by another output buffer or, if there are no other output buffers, sent directly to the browser.

Bộ đệm đầu ra Python là gì?

Tóm tắt: Bộ đệm đầu ra Python là quá trình lưu trữ đầu ra của mã của bạn trong bộ nhớ đệm.Khi bộ đệm đầy, đầu ra sẽ được hiển thị trên màn hình đầu ra tiêu chuẩn.the process of storing the output of your code in buffer memory. Once the buffer is full, the output gets displayed on the standard output screen.