超全局?jǐn)?shù)組$_SERVER
$_SERVER
是什么
GatewayWorker中的超全局?jǐn)?shù)組$_SERVER
包含了5個元素,分別是:
- REMOTE_ADDR // 客戶端ip(如果客戶端處于局域網(wǎng),則是客戶端所在局域網(wǎng)的出口ip)
- REMOTE_PORT // 客戶端端口(如果客戶端處于局域網(wǎng),則是客戶端所在局域網(wǎng)的出口端口)
- GATEWAY_ADDR // gateway所在服務(wù)器的ip
- GATEWAY_PORT // geteway監(jiān)聽的端口,這對于多端口應(yīng)用中在Event.php里區(qū)分客戶端連的是哪個端口非常有用
- GATEWAY_CLIENT_ID // 全局唯一的客戶端id,也就是client_id
注意:
$_SERVER
無法在Events::onWorkerStart
回調(diào)里獲取
$_SERVER
使用場景
當(dāng)需要在Event.php中獲得客戶端的ip及端口信息時,可以使用$_SERVER['REMOTE_ADDR']
和$_SERVER['REMOTE_PORT']
獲得。當(dāng)想在某個函數(shù)邏輯處理時獲得當(dāng)前客戶端的client_id時,可以使用$_SERVER['GATEWAY_CLIENT_ID']
方便的獲得
注意:
Events::onWorkerStart
Events::onWorkerStop
中無法使用$_SERVER
$_SERVER
原理
在WorkerMan的Gateway/BusinessWorker模型中,每個客戶端都會連接在gateway進(jìn)程上,當(dāng)gateway進(jìn)程收到客戶端的數(shù)據(jù)時,會將客戶端的ip端口及client_id連通消息傳遞給worker進(jìn)程,worker進(jìn)程初始化$_SERVER
數(shù)組便可以使用了。
示例(向客戶端發(fā)送客戶端ip)
class Events
{
public static function onMessage($client_id, $data)
{
Gateway::sendToClient($client_id, $_SERVER['REMOTE_ADDR']);
}
}