2010-06-07 45 views
11

Tôi đang cố thiết lập kết nối HTTP liên tục từ ứng dụng Silverlight đến trang PHP (nghĩa là không tạo kết nối TCP mới cho mỗi yêu cầu HTTP) được máy chủ Apache lưu trữ."Connection: Keep-Alive" trong phản hồi của máy chủ

Để kết thúc này, tôi cần máy chủ web gửi phản hồi HTTP của mình với tiêu đề "Kết nối" được đặt thành "Keep-alive". Phía máy khách, dường như không có vấn đề gì vì API mạng do Silverlight cung cấp về cơ bản là trình bao bọc của capabilies mạng trình duyệt, từ những gì tôi đã đọc: vì vậy nếu trình duyệt hỗ trợ HTTP 1.1 và Connection: Keep-Alive theo mặc định cho các yêu cầu của nó, nó ổn. Độ dài nội dung cũng được xác định rõ, để máy chủ biết khi nào , nó phải gửi phản hồi. Tuy nhiên, phản hồi của máy chủ với yêu cầu PHP đặt "Connection:" có hệ thống thành "close", do đó kết thúc kết nối và ngăn chặn kết nối liên tục.

Tôi đã thử một số việc để giải quyết vấn đề này: Các phương thức khác nhau (GET và POST), đưa ra một cách rõ ràng "Kết nối: tiếp tục sống" với mã PHP sau ở đầu tập lệnh của tôi:

header("Connection: Keep-alive"); 

Sau đó thêm tiêu đề dự kiến ​​vào phản hồi, điều này là tốt, nhưng thêm "Kết nối: đóng" vẫn được thêm vào sau trong tiêu đề phản hồi.

Đây có phải là tính năng của PHP hoặc Apache thực thi "đóng" (vì mục đích bảo mật hoặc hiệu suất, tôi đoán) hoặc tôi chỉ thiếu một thứ gì đó ở đây?

Xin cảm ơn trước.

P.S. : Bằng cách sniffing packet, tôi đã nhận thấy rằng không có nhiều trang web sử dụng "Keep-alive" và kết nối TCP được thiết lập lại. Không Keepalive hành vi mặc định và ưa thích theo HTTP 1.1?

+0

Đó có thể là apache, chứ không phải PHP - theo hiểu biết tốt nhất của tôi, PHP không kiểm soát được điều đó. Bạn có thể xác minh bằng cách cố gắng yêu cầu một tệp tĩnh thông qua cùng một kết nối. Chỉ thị Apache: http://httpd.apache.org/docs/2.2/mod/core.html#keepalive –

Trả lời

24

Chức năng Keep-Alive không dành cho các kết nối liên tục.

Keep-Alive nhằm giảm số lượng kết nối cho trang web. Thay vì tạo một kết nối mới cho mỗi hình ảnh/css/javascript trong một trang web, nhiều yêu cầu sẽ được thực hiện lại bằng cách sử dụng cùng một kết nối.

Có một số cài đặt ngăn điều này trong Apache, chẳng hạn như số lượng yêu cầu tối đa trên kết nối hoặc thời gian chờ giữa các yêu cầu. Điều này cũng sẽ ăn tài nguyên của bạn rất nhanh bởi vì mọi kết nối đều cần chuỗi riêng của nó.

Bạn nên chuyển sang giải pháp khác, được tạo cho loại công việc đó.

Đối với dịch vụ mà giữ kết nối của bạn mở, bạn có thể có một cái nhìn tại http://orbited.orghttp://twistedmatrix.com/trac/

+1

+1 vì không lạm dụng HTTP cho các kết nối liên tục. Thật dễ dàng để cho một daemon PHP nghe một cổng/socket nếu cần thiết. – Wrikken

+0

vâng, đó cũng là một khả năng.trong quỹ đạo opionion của tôi có thể làm điều đó dễ dàng hơn nhiều và ổn định hơn trong khi vẫn cung cấp máy chủ http cơ bản :) – favo

+0

Tôi đang lập trình một ứng dụng nhắn tin tức thời thời gian thực (giống như Google Wave cho khía cạnh thời gian thực) trong ngữ cảnh bị hạn chế (PHP chỉ và các tính năng webserver tối thiểu). Tôi thậm chí không được phép sử dụng datebases. Trong kiểu yêu cầu gây áp lực này (mỗi lần gõ phím về cơ bản tạo ra một yêu cầu), sẽ hữu ích khi giữ kết nối với máy chủ. Cảm ơn lời khuyên của bạn. – ZenithM

5

Kể từ PHP không quản lý các kết nối HTTP, nó không có cách nào để thay đổi cài đặt này. Bạn cần phải đặt nó trong các máy chủ. Ví dụ: bạn có thể bật tính năng giữ chân như thế này trong Apache nếu bạn đang sử dụng mod_php,

KeepAlive On 
+0

Cảm ơn, thông số này thực sự dường như được đặt thành Tắt trên máy chủ của tôi. – ZenithM

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