CẬP NHẬT
Cách để xử lý trường hợp này là sự kết hợp của bộ đệm đầu ra và các tiêu đề HTTP thích hợp.
Từ HTTP/1.1 Specification Section 14.10:
HTTP/1.1 định nghĩa "gần" tùy chọn kết nối cho người gửi để dấu hiệu cho thấy kết nối sẽ được đóng lại sau khi kết thúc phản ứng .
Vì vậy, nếu chúng ta vượt qua cùng một HTTP Content-Length tiêu đề, thêm vào kết nối: gần, trình duyệt biết để đóng kết nối sau khi chiều dài đáp ứng quy định được nhận:
- Đệm tất cả đầu ra tập lệnh để bạn duy trì khả năng gửi tiêu đề
- Khi bạn có dữ liệu đầu ra đầy đủ, hãy gửi tiêu đề thích hợp cho ứng dụng khách
- Tiếp tục r xử lý ... nhưng không cố gắng gửi đầu ra hoặc bạn sẽ nhận được lỗi vì tiêu đề đã được gửi.
Ngoài ra, hãy cẩn thận vì bạn có thể chạy lên chống lại giới hạn thời gian thực thi tập lệnh trong máy chủ web SAPI nếu bạn xử lý quá nhiều. Cuối cùng, bạn nên yêu cầu PHP bỏ qua "người dùng hủy bỏ" trong tập lệnh cụ thể này bằng cách sử dụng ignore_user_abort()
vì trình duyệt sẽ đóng kết nối do kết quả của những gì bạn đang làm và bạn muốn PHP tiếp tục xử lý.
<?php
ignore_user_abort();
ob_start();
// do stuff, generate output
// get size of the content
$length = ob_get_length();
// tell client to close the connection after $length bytes received
header('Connection: close');
header("Content-Length: $length");
// flush all output
ob_end_flush();
ob_flush();
flush();
// close session if you have one ...
// continue your processing tasks ...
?>
Bạn có thể kiểm tra hướng dẫn phần PHP trên Connection handlingdocs.
Hoặc, tại sao không bắt đầu lưu vào bộ đệm đầu ra? Sau đó, bạn có thể nắm bắt tất cả các đầu ra sẽ được gửi sau đó quyết định sau này nếu bạn thực sự muốn làm bất cứ điều gì với nó.
<?php
echo 'before output buffering';
ob_start();
echo 'after output buffering';
$output = ob_get_contents();
// script's only output to this point will be 'before output buffering'
// I changed my mind, send the output ...
ob_end_flush();
?>
Tại sao bạn cần phải làm điều này? Bạn có thể đăng một chút mã của mình để giúp chúng tôi hiểu thêm một chút không? –
+1 theo những gì Jonathan nói. Hãy cho chúng tôi biết thêm một chút về lý do bạn muốn thực hiện điều này. –