Câu trả lời:
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.
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.
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.
Xem xét ví dụ này:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
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ì.
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 đó echo
sẽ gửi dữ liệu ngay lập tức đến Trình duyệt.
Nếu bộ đệm đầu ra được bật, thì nó echo
sẽ gửi dữ liệu đến bộ đệm đầu ra trước khi gửi nó đến Trình duyệt.
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_buffering
sẽ cho bạn biết nếu bộ đệm đầu ra được bật / tắt.
Trong trường hợp này, output_buffering
giá 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.ini
dướ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_buffering
nà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 echo
và 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:
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:
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ủ đề
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()
và 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
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 :)