2011-09-05 42 views
5

PHP có gửi mã khi nó xử lý tệp hay không, nó có thể soạn toàn bộ phản hồi HTML và sau đó gửi nó qua không? Ví dụ, nó sẽ làm cho bất kỳ sự khác biệt để di chuyển các hàm PHP đắt tiền vào chân trang tệp trên máy chủ?Việc mã PHP có ở đầu trang hoặc chân trang có quan trọng không?

Ngoài ra, liệu có khác biệt gì nếu bạn đang sử dụng Transfer-Encoding: chunked?

Trả lời

3

Cuối cùng, điều đó tùy thuộc. Hầu hết các cơ chế lưu trữ PHP mà tôi đã sử dụng sẽ truyền tải phản hồi theo khối, vì nó được nhận từ kịch bản, bỏ qua hoàn toàn tiêu đề Content-Length (vì điều này không được biết trước). Bạn có thể xóa phản hồi bằng cách sử dụng flush() theo định kỳ để buộc máy chủ truyền tải những gì nó đã đệm cho đến nay cho khách hàng.

Vì vậy, nếu bạn định làm những việc mất nhiều thời gian và muốn cho phép trang hiển thị trước, cách thích hợp để thực hiện việc này sẽ là xuất nhiều trang nhất có thể, gọi flush() và sau đó thực hiện các tác vụ tốn kém của bạn. Chỉ cần chắc chắn không mất nhiều thời gian hơn thời lượng tập lệnh PHP tối đa được khai báo.


Được rồi, vì vậy lời giải thích đó là phải thừa nhận là một chút quá đơn giản hóa:

Tiêu đề Content-Length thực sự có thể được gửi dưới một số trường hợp. Ví dụ, nếu đáp ứng của kịch bản nhỏ hơn bộ đệm của PHP cho dữ liệu được gửi và/hoặc nếu tập lệnh thực hiện theo một khoảng thời gian nhất định để thực thi, thì máy chủ sẽ biết chính xác khoảng thời gian nội dung và có thể thêm tiêu đề độ dài.

Hơn nữa, flush()có thể không thực sự làm bất cứ điều gì. Điều này phụ thuộc vào cấu hình máy chủ của bạn và các yếu tố khác. Lưu ý cụ thể những cảnh báo này trong tài liệu liên quan đến hành vi phía máy chủ:

flush() có thể không ghi đè sơ đồ đệm của máy chủ web và không ảnh hưởng đến bất kỳ bộ đệm phía máy khách nào trong trình duyệt. Nó cũng không ảnh hưởng đến cơ chế đệm đầu ra của không gian người dùng của PHP. Điều này có nghĩa là bạn sẽ phải gọi cả ob_flush() và flush() để xóa các bộ đệm đầu ra ob nếu bạn đang sử dụng chúng.

Một số máy chủ, đặc biệt là trên Win32, sẽ vẫn đệm đầu ra từ tập lệnh của bạn cho đến khi nó kết thúc trước khi truyền kết quả đến trình duyệt.

Mô-đun máy chủ cho Apache như mod_gzip có thể tự lưu vào bộ đệm của riêng mình, điều này sẽ khiến flush() không dẫn đến dữ liệu được gửi ngay cho khách hàng.

Nói cách khác: kiểm tra, thử nghiệm, kiểm tra. Đảm bảo rằng máy chủ web không can thiệp vào hành vi bạn đang cố gắng đạt được. Cấu hình lại máy chủ web nếu cần.

+0

Câu trả lời hay, cảm ơn! –

Các vấn đề liên quan