Các chức năng ob_end_flush[] và ob_end_clean[] được bổ sung bởi ob_flush[] và ob_clean[] - những chức năng này thực hiện các công việc giống như những người anh em họ lâu hơn của chúng, với điểm khác biệt là chúng không kết thúc bộ đệm đầu ra. Chúng ta có thể viết lại kịch bản trước đó như thế này
Lần này, bộ đệm được xóa nhưng để mở, sau đó được làm sạch và vẫn để mở, và cuối cùng được PHP tự động đóng và xóa khi tập lệnh kết thúc - điều này giúp tiết kiệm việc tạo và hủy bộ đệm đầu ra. Sử dụng lại bộ đệm như thế này nhanh hơn khoảng 60% so với việc mở và đóng bộ đệm mọi lúc và là một bước đi thông minh nếu bạn từng gặp phải tình huống này
Bạn muốn học PHP 7?
Hacking with PHP đã được cập nhật đầy đủ cho PHP 7 và hiện có sẵn dưới dạng PDF có thể tải xuống. Nhận hơn 1200 trang học PHP thực hành ngay hôm nay
Nếu điều này hữu ích, vui lòng dành chút thời gian để nói với những người khác về Hacking với PHP bằng cách tweet về nó
Hàm PHP ob_flush[] xóa nội dung của bộ đệm đầu ra. Hàm này không phá hủy bộ đệm đầu ra như ob_end_flush[]
cú pháp
Thông số
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
7Giá trị trả về
Trả về true khi thành công hoặc false nếu thất bại
Ví dụ. ob_flush[] ví dụ
Ví dụ dưới đây cho thấy cách sử dụng hàm ob_flush[]
Đầu ra của đoạn mã trên sẽ là
New content is added to the output buffer.
❮ Tham khảo kiểm soát đầu ra PHP
Những gì bạn không thể học được từ tài liệu + bản vá lỗ hổng bảo mật + lời khuyên về cách tăng tốc độ phản hồi của máy chủ
Bộ đệm đầu ra cho phép bạn có đầu ra của PHP [được tạo chủ yếu bởi
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
1] được lưu vào bộ nhớ [tức là. bộ đệm] thay vì được truyền ngay đến trình duyệt hoặc thiết bị đầu cuối. Điều này hữu ích cho nhiều nhiệm vụ khác nhauNgăn chặn đầu ra
ob_start[]; // turns on output buffering
$foo->bar[]; // all output goes only to buffer
ob_end_clean[]; // clears buffer and closes buffering
Chụp đầu ra cho một biến
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
Cặp
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
2 và ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
3 có thể được thay thế bằng một chức năng duy nhất ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
4, tên của nó đã biến mất ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
5 mặc dù nó thực sự tắt bộ đệm đầu ra0
Trong các ví dụ trên, bộ đệm nhận được không được gửi đến đầu ra. Nếu bạn muốn gửi nó, hãy sử dụng
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
6 thay vì ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
3. Để có được nội dung của bộ đệm, hãy gửi nó đến đầu ra và tắt bộ đệm, lại có một chức năng duy nhất [bao gồm cả tên ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
5 bị thiếu]. ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
9Bộ đệm có thể được làm trống bất cứ lúc nào mà không cần phải tắt nó, sử dụng
00 [xóa nó] hoặc
01 [gửi nó ra đầu ra]
7
Vào bộ đệm cũng được gửi đầu ra được ghi vào
02, trong khi bộ đệm có thể tránh được bằng cách ghi vào `php. //stdout` [hoặc
03], chỉ khả dụng trong CLI, tức là. khi chạy tập lệnh từ dòng lệnh
làm tổ
Các bộ đệm có thể được lồng vào nhau, vì vậy trong khi một bộ đệm đang hoạt động, một
04 khác sẽ kích hoạt một bộ đệm mới. Vì vậy,
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
6 và 01 không thực sự gửi bộ đệm tới đầu ra mà tới bộ đệm chính. Và chỉ khi không có bộ đệm cha, nội dung mới được gửi tới trình duyệt hoặc thiết bị đầu cuối
Do đó, điều quan trọng là tắt tính năng đệm, ngay cả khi xảy ra ngoại lệ
New content is added to the output buffer.3
Kích thước bộ đệm [kích thước khối]
Bộ đệm cũng có thể cải thiện hiệu suất máy chủ khi PHP sẽ không gửi từng ________ 31 tới trình duyệt mà sẽ gửi các khối dữ liệu lớn hơn, vì . Chỉ cần gọi ở đầu tập lệnh.
New content is added to the output buffer.5
Khi kích thước bộ đệm vượt quá 4096 byte, PHP sẽ tự động thực thi
08, nghĩa là. bộ đệm được làm trống và gửi đi. Bạn có thể đạt được điều tương tự bằng cách đặt chỉ thị bị bỏ qua trong CLI
Hãy cẩn thận, nếu bạn bắt đầu lưu vào bộ đệm mà không có kích thước khối [tức là. một
04 đơn giản] nó sẽ khiến trang không được gửi liên tục mà gửi một lần ở cuối tập lệnh, do đó máy chủ sẽ phản hồi rất chậm
tiêu đề HTTP
Bộ đệm đầu ra không ảnh hưởng đến tiêu đề HTTP, chúng được xử lý theo cách khác. Tuy nhiên, do bộ đệm, bạn có thể gửi tiêu đề ngay cả sau khi đầu ra đã được gửi, vì nó vẫn còn trong bộ đệm. Tuy nhiên, bạn không nên dựa vào tác dụng phụ này vì không có gì chắc chắn khi đầu ra vượt quá kích thước bộ đệm
Lỗ hổng bảo mật
Khi tập lệnh PHP kết thúc, tất cả các bộ đệm đang chờ xử lý sẽ ghi nội dung của nó vào đầu ra. Đây có thể coi là lỗ hổng bảo mật khó chịu. Nếu bạn đang chuẩn bị dữ liệu nhạy cảm trong bộ đệm không dành cho đầu ra và xảy ra lỗi, PHP sẽ ghi dữ liệu đó vào đầu ra. Giải pháp là sử dụng trình xử lý tùy chỉnh
New content is added to the output buffer.8
xử lý tùy chỉnh
Bạn có thể đặt trình xử lý tùy chỉnh của riêng mình, tức là. một chức năng xử lý nội dung của bộ đệm trước khi gửi đi
New content is added to the output buffer.9
Ngoài ra, trình xử lý triệu gọi
00 và
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
3, nhưng sẽ loại bỏ đầu ra. Trình xử lý có thể xác định hàm nào được gọi và trả lời hàm đó thông qua tham số thứ hai 73, là một mặt nạ bit [kể từ PHP 5. 4]
6 hoặcob_start[]; // turns on output buffering $foo->render[]; // output goes only to buffer $output = ob_get_contents[]; // stores buffer contents to the variable ob_end_clean[]; // clears buffer and closes buffering
9]ob_start[]; // turns on output buffering $foo->render[]; // output goes only to buffer $output = ob_get_contents[]; // stores buffer contents to the variable ob_end_clean[]; // clears buffer and closes buffering
New content is added to the output buffer.
30 khi gọi
3 vàob_start[]; // turns on output buffering $foo->render[]; // output goes only to buffer $output = ob_get_contents[]; // stores buffer contents to the variable ob_end_clean[]; // clears buffer and closes buffering
4ob_start[]; // turns on output buffering $foo->render[]; // output goes only to buffer $output = ob_get_contents[]; // stores buffer contents to the variable ob_end_clean[]; // clears buffer and closes buffering
- ________ 234 tự động ________ 108
Các giai đoạn bắt đầu, kết thúc và tuôn ra [tương ứng. sạch] có thể xảy ra đồng thời. Nó có thể được phân biệt bằng cách sử dụng toán tử nhị phân
New content is added to the output buffer.36
ob_start[]; // turns on output buffering
$foo->bar[]; // all output goes only to buffer
ob_end_clean[]; // clears buffer and closes buffering
6Giai đoạn
New content is added to the output buffer.34 chỉ xảy ra khi kích thước bộ đệm đã bị vượt quá. Nó là một tuôn ra tự động. Hãy cẩn thận, hằng số
New content is added to the output buffer.34 có giá trị bằng 0, vì vậy bạn không thể sử dụng toán tử nhị phân, nhưng
ob_start[]; // turns on output buffering
$foo->bar[]; // all output goes only to buffer
ob_end_clean[]; // clears buffer and closes buffering
9Trình xử lý có thể không hỗ trợ tất cả các hoạt động.
04 có thể chỉ định các hoạt động được hỗ trợ bằng mặt nạ bit trong tham số thứ ba
New content is added to the output buffer.
50 – bạn có thể gọi hàmNew content is added to the output buffer.
52 – bạn có thể gọi sốNew content is added to the output buffer.
54 – có thể tắt bộ đệmNew content is added to the output buffer.
55 – là sự kết hợp của cả ba cờ, hành vi mặc định
Những cờ này có thể được sử dụng mà không cần trình xử lý riêng. Ví dụ: nếu tôi muốn ghi đầu ra vào một biến, việc bỏ qua cờ
New content is added to the output buffer.52 cho biết rằng bộ đệm không thể [có lẽ do nhầm lẫn] gửi đến đầu ra qua
01. Tuy nhiên, bạn có thể làm như vậy qua
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
6 hoặc ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
9, vì vậy nó sẽ mất đi một số ý nghĩaTương tự, việc không có cờ
New content is added to the output buffer.50 tránh xóa bộ đệm, nhưng một lần nữa, nó không hoạt động
Và cuối cùng, sự vắng mặt của
New content is added to the output buffer.54 có nghĩa là người dùng không thể tắt bộ đệm. Một ví dụ về trình xử lý thích hợp để không thể xóa được, là
New content is added to the output buffer.82 nén đầu ra và do đó giảm lưu lượng và tăng tốc độ truyền dữ liệu. Khi bộ đệm này mở ra, nó sẽ gửi tiêu đề HTTP
New content is added to the output buffer.83 và tất cả đầu ra khác phải được nén. Vì vậy, bộ đệm không được loại bỏ
Cách sử dụng đúng là
ob_start[]; // turns on output buffering
$foo->render[]; // output goes only to buffer
$output = ob_get_contents[]; // stores buffer contents to the variable
ob_end_clean[]; // clears buffer and closes buffering
0Tính năng nén đầu ra cũng có thể được kích hoạt bằng lệnh
New content is added to the output buffer.84, lệnh này bật tính năng lưu vào bộ đệm bằng một trình xử lý khác [tôi không biết chúng khác nhau như thế nào], nhưng thật không may là bộ đệm có thể tháo rời. Bởi vì nó phù hợp để nén tất cả các tệp văn bản, không chỉ đầu ra PHP, tốt hơn là nên kích hoạt tính năng nén trên máy chủ HTTP