Gateway/Worker 개발 모델은 서버 측 하트비트 감지를 지원하여 정기적으로 애플리케이션 계층의 하트비트를 클라이언트에 보낼 수 있으며, 극단적인 클라이언트 연결 끊김 상황(정전, 갑작스러운 네트워크 장애 등)을 신속하게 감지할 수 있습니다. .).
참고: 긴 연결 애플리케이션은 하트비트를 추가해야 합니다. 그렇지 않으면 오랫동안 통신이 없어 라우팅 노드에 의해 연결이 강제로 끊어질 수 있습니다. (추천 학습: workerman tutorial)
heartbeat에는 두 가지 주요 기능이 있습니다:
1 클라이언트는 정기적으로 서버에 포인트 데이터를 보내 일부 노드의 방화벽에 의해 연결이 끊어지는 것을 방지합니다. 오랫동안 통신이 끊긴 상황.
2. 서버는 하트비트를 통해 클라이언트가 온라인 상태인지 확인할 수 있습니다. 클라이언트가 지정된 시간 내에 데이터를 보내지 않으면 클라이언트는 오프라인으로 간주됩니다. 이는 극단적인 상황(정전, 네트워크 연결 끊김 등)으로 인해 클라이언트가 오프라인 상태가 되는 이벤트를 감지할 수 있습니다.
권장 하트비트 간격 값:
클라이언트가 60초 미만(예: 55초)의 하트비트 간격을 전송하는 것이 좋습니다.
예:
<?php require_once __DIR__ . '/Workerman/Autoloader.php'; use Workerman\Worker; use Workerman\Lib\Timer; // 心跳间隔55秒 define('HEARTBEAT_TIME', 55); $worker = new Worker('text://0.0.0.0:1234'); $worker->onMessage = function($connection, $msg) { // 给connection临时设置一个lastMessageTime属性,用来记录上次收到消息的时间 $connection->lastMessageTime = time(); // 其它业务逻辑... }; // 进程启动后设置一个每秒运行一次的定时器 $worker->onWorkerStart = function($worker) { Timer::add(1, function()use($worker){ $time_now = time(); foreach($worker->connections as $connection) { // 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间 if (empty($connection->lastMessageTime)) { $connection->lastMessageTime = $time_now; continue; } // 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接 if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) { $connection->close(); } } }); }; Worker::runAll();
위 구성은 클라이언트가 55초 이상 서버에 데이터를 보내지 않으면 서버는 클라이언트가 오프라인 상태라고 생각하여 연결을 닫고 트리거한다는 것입니다. onClose.
위 내용은 작업자 하트비트를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!