Realtime web 必須具備主動發送訊息的機制
Long Polling - IE6 也可以的方案
Chunked Transfer Encoding - HTTP 1.1 新增
將資料拆成一個一個區塊送回去, Header, Data * n , End
Header: Transfer-Encoding: chunked
Long Polling 只能單向溝通(Server -> Client), 還有 Cross Domain 的問題.
WebSocket: 持久連線, 雙向溝通, 允許 Binary Data, 支援 Cross Domain.
C10K Problem - Server 同時間大量連線
硬體不再是效能的瓶頸點 (CPU / RAM 加倍也沒用)
每個 Thread / Process 只服務一個連線, 透過 Blocking I/O 處理連線. ex: Apache with Prefork / Worker MPM.
Blocking I/O: 充分運用 CPU 資源
一個 Thread / Process 處理多個連線, 使用事件驅動方式處理連線. ex: Nginx, Memcached, Node.js
Asynchronous I/O: 節省記憶體, 反應速度快, 架構簡單.
程式邏輯需注意 Blocked API, 會導致其他連線也被 Block.
select(), poll() 效能會隨著數量遞減, 時間複雜度 O(n)
socket_select(): 1024 limit on Linux (FDSET_SIZE)
新一代事件通知事件: kqueue: *BSD / epoll: Linux / /dev/pool: Solaris. 時間複雜度為 O(1) - 缺點: API 不相容, 使用 libevent 來解決.
pecl Libevent (難用), 可用 pecl event
pecl event: OOP, 支援 libevent2, HTTP DNS OpenSSL 支援
setDefaultCallback(function($request) {});
setCallback('hello', ....)
buffer: 所有輸出輸入都在 Buffer 裡
setCallbacks(onRead, onWrite, onEvent, $arg);
onWrite: 當資料已經送出, Buffer Empty
onEvent: 當連線狀態改變, 例如使用者斷線.
Socket.IO - the cross-browser WebSocket for realtime apps
支援 wesocket, JSONP Polling, XHRPolling, 和 Socket.IO 相似用法
PHP 5.4 以上, ext-event (1.8 以上)