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


Câu trả lời:


274

Bộ đệm đầu ra cho nhà phát triển web, Hướng dẫn cho người mới bắt đầu :

Không có bộ đệm đầu ra (mặc định), HTML của bạn được gửi tới trình duyệt theo từng phần khi PHP xử lý thông qua tập lệnh của bạn. Với bộ đệm đầu ra, HTML của bạn được lưu trữ trong một biến và được gửi đến trình duyệt dưới dạng một đoạn ở cuối tập lệnh của bạn.

Ưu điểm của bộ đệm đầu ra cho các nhà phát triển Web

  • Chỉ bật bộ đệm đầu ra sẽ giảm thời gian tải xuống và hiển thị HTML của chúng tôi vì nó không được gửi tới trình duyệt theo từng phần khi PHP xử lý HTML.
  • Tất cả những thứ ưa thích chúng ta có thể làm với các chuỗi PHP, bây giờ chúng ta có thể làm với toàn bộ trang HTML của mình dưới dạng một biến.
  • Nếu bạn đã từng gặp thông báo "Cảnh báo: Không thể sửa đổi thông tin tiêu đề - các tiêu đề đã được gửi bởi (đầu ra)" trong khi đặt cookie, bạn sẽ rất vui khi biết rằng bộ đệm đầu ra là câu trả lời của bạn.

6
+1. Đây là một liên kết hữu ích khác: php.net/manual/en/feft.ob-start.php - cũng hữu ích khi xử lý một hàm lặp lại một giá trị mà bạn muốn lưu trữ trong một biến.
Cam

Có thực sự là tất cả mọi thứ được đệm cho đến cuối cùng, hoặc trang sẽ chỉ ở dạng khối nếu tôi có một trang dài vô tận?
zedoo

5
@enedoo nếu bạn bắt đầu đệm đầu ra ob_start(), thực sự mọi thứ đều được đệm. có một tham số tùy chọn thứ hai để ob_start(), int $chunk_size, trong đó, nếu thiết lập, sẽ gây ra các bộ đệm để được rửa sau khi bất kỳ cuộc gọi ra mà nguyên nhân chiều dài của bộ đệm để bằng hoặc vượt quá kích thước này.
rìu.

12
Nếu bạn nhận được "Cảnh báo: Không thể sửa đổi thông tin tiêu đề", điều đó có nghĩa là trước tiên bạn cần kiểm tra mã của mình vì cho phép bộ đệm đầu ra là bản sửa lỗi của triệu chứng chứ không phải nguyên nhân. Một cái gì đó đang viết trước khi đến lượt. Vì vậy, tôi không đồng ý, nhưng không đủ để trả lời câu trả lời.
Glenn Plas

5
Tôi chỉ thấy những cuộc phiêu lưu của việc sử dụng bộ đệm, vậy tại sao nó không được bật theo mặc định trong php?
Thomas Bandera

69

Bộ đệm đầu ra được PHP sử dụng để cải thiện hiệu năng và thực hiện một vài thủ thuật.

  • Bạn có thể để PHP lưu trữ tất cả đầu ra vào một bộ đệm và xuất tất cả đầu ra cùng một lúc để cải thiện hiệu suất mạng.

  • Bạn có thể truy cập nội dung bộ đệm mà không gửi lại cho trình duyệt trong một số trường hợp.

Xem xét ví dụ này:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

Ví dụ trên ghi lại đầu ra thành một biến thay vì gửi nó đến trình duyệt. output_buffering bị tắt theo mặc định.

  • Bạn có thể sử dụng bộ đệm đầu ra trong các tình huống khi bạn muốn sửa đổi các tiêu đề sau khi gửi nội dung.

Xem xét ví dụ này:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

Câu hỏi tương tự ở đây đối với Axe: không bắt đầu bộ đệm đầu ra mà không tắt nó sau, sẽ làm cho tập lệnh của bạn gặp phải tất cả các loại vấn đề?
Edward Stumperd

1
Bộ đệm được xóa khi bạn gọi một trong các phương thức tuôn ra (ví dụ ob_flush()hoặc ob_end_flush()). Nội dung của bộ đệm cũng bị xóa khi tập lệnh của bạn kết thúc, đột ngột hoặc nếu không thì không có vấn đề gì.
Salman A

17

Tôi biết rằng đây là một câu hỏi cũ nhưng tôi muốn viết câu trả lời của mình cho người học trực quan. Tôi không thể tìm thấy bất kỳ sơ đồ nào giải thích bộ đệm đầu ra trên web trên toàn thế giới vì vậy tôi đã tự tạo một sơ đồ trong Windows mspaint.exe.

Nếu bộ đệm đầu ra bị tắt, sau đó echosẽ gửi dữ liệu ngay lập tức đến Trình duyệt.

nhập mô tả hình ảnh ở đây

Nếu bộ đệm đầu ra được bật, thì nó echosẽ gửi dữ liệu đến bộ đệm đầu ra trước khi gửi nó đến Trình duyệt.

nhập mô tả hình ảnh ở đây

phpinfo

Để xem liệu bộ đệm đầu ra có được bật / tắt hay không, vui lòng tham khảo phpinfo ở phần cốt lõi. Lệnh output_bufferingsẽ cho bạn biết nếu bộ đệm đầu ra được bật / tắt.

nhập mô tả hình ảnh ở đây Trong trường hợp này, output_bufferinggiá trị là 4096, có nghĩa là kích thước bộ đệm là 4 KB. Điều đó cũng có nghĩa là bộ đệm đầu ra được bật, trên máy chủ Web.

php.ini

Có thể bật / tắt và thay đổi kích thước bộ đệm bằng cách thay đổi giá trị của lệnh output_buffering. Chỉ cần tìm nó trong php.ini, thay đổi nó thành cài đặt bạn chọn và khởi động lại máy chủ Web. Bạn có thể tìm thấy một mẫu của tôi php.inidưới đây.

; Output buffering is 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.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
;   functions.
; Possible Values:
;   On = Enabled and buffer is unlimited. (Use with caution)
;   Off = Disabled
;   Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096

Lệnh output_bufferingnày không phải là chỉ thị có thể cấu hình duy nhất về bộ đệm đầu ra. Bạn có thể tìm thấy các chỉ thị bộ đệm đầu ra có thể định cấu hình khác tại đây: http://php.net/manual/en/outcontrol.configuration.php

Ví dụ: ob_get_clean ()

Dưới đây bạn có thể xem cách chụp echovà thao tác trước khi gửi tới trình duyệt.

// Turn on output buffering  
ob_start();  

echo 'Hello World';  // save to output buffer

$output = ob_get_clean();  // Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output); // manipulate the output  

echo $output;  // send to output stream / Browser

// OUTPUT:  
HELLO WORLD

Ví dụ: Hackingwithphp.com

Thông tin thêm về bộ đệm đầu ra với các ví dụ có thể được tìm thấy ở đây:

http://www.hackingwithphp.com/13/0/0/output-buffering


9

Các chức năng Kiểm soát đầu ra cho phép bạn kiểm soát khi đầu ra được gửi từ tập lệnh. Điều này có thể hữu ích trong một số tình huống khác nhau, đặc biệt nếu bạn cần gửi tiêu đề đến trình duyệt sau khi tập lệnh của bạn đã bắt đầu xuất dữ liệu. Các hàm Điều khiển đầu ra không ảnh hưởng đến các tiêu đề được gửi bằng tiêu đề () hoặc setcookie (), chỉ các chức năng như echo () và dữ liệu giữa các khối mã PHP.

http://php.net/manual/en/book.outcontrol.php

Nhiêu tai nguyên hơn:

Bộ đệm đầu ra với PHP


4

Như tên gợi ý ở đây bộ nhớ đệm được sử dụng để quản lý cách xuất ra tập lệnh.

Đây là một hướng dẫn rất tốt cho chủ đề


1
ob_start();  // turns on output buffering
$foo->bar();  // all output goes only to buffer
ob_clean();  // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents();  // buffer content is now an empty string
ob_end_clean();  // turn off output buffering

Bộ đệm có thể được lồng nhau, vì vậy trong khi một bộ đệm đang hoạt động, một bộ đệm khác ob_start()kích hoạt bộ đệm mới. Vì vậy, ob_end_flush()ob_flush()không thực sự gửi bộ đệm đến đầu ra, mà đến bộ đệm cha. Và chỉ khi không có bộ đệm cha, nội dung mới được gửi đến trình duyệt hoặc thiết bị đầu cuối.

Giải thích độc đáo tại đây: https : // phpf Fashion.com/everything-about-output-buffering-in-php


0

CẬP NHẬT 2019. Nếu bạn có máy chủ chuyên dụng và SSD hoặc NVM tốt hơn, 3.5GHZ. Bạn không nên sử dụng bộ đệm để tạo trang web được tải nhanh hơn trong 100ms-150ms.

Mạng trở nên chậm hơn so với việc tạo tập lệnh vào năm 2019 với các máy chủ hiệu suất (sever, bộ nhớ, đĩa) và bật APC PHP :) Để tạo tập lệnh đôi khi chỉ cần 70ms, thời gian khác chỉ mất thời gian, từ 10ms đến 150ms từ vị trí người dùng máy chủ.

Vì vậy, nếu bạn muốn nhanh 150ms, bộ đệm làm chậm, vì cần thêm dữ liệu bộ đệm bộ sưu tập, nó phải trả thêm chi phí. 10 năm trước, khi máy chủ tạo tập lệnh 1s, nó rất hữu ích.

Xin vui lòng xuất ra_buffering có giới hạn nếu bạn muốn sử dụng jpg để tải nó có thể tự động xóa và gửi sự cố.

Chúc mừng.

Bạn có thể làm sông nhanh hoặc Bạn có thể làm tama an toàn :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.