>PHP 프레임워크 >Workerman >작업자 하트비트를 사용하는 방법

작업자 하트비트를 사용하는 방법

(*-*)浩
(*-*)浩원래의
2019-12-02 10:32:224417검색

작업자 하트비트를 사용하는 방법

Gateway/Worker 개발 모델은 서버 측 하트비트 감지를 지원하여 정기적으로 애플리케이션 계층의 하트비트를 클라이언트에 보낼 수 있으며, 극단적인 클라이언트 연결 끊김 상황(정전, 갑작스러운 네트워크 장애 등)을 신속하게 감지할 수 있습니다. .).

참고: 긴 연결 애플리케이션은 하트비트를 추가해야 합니다. 그렇지 않으면 오랫동안 통신이 없어 라우팅 노드에 의해 연결이 강제로 끊어질 수 있습니다. (추천 학습: workerman tutorial)

heartbeat에는 두 가지 주요 기능이 있습니다:

1 클라이언트는 정기적으로 서버에 포인트 데이터를 보내 일부 노드의 방화벽에 의해 연결이 끊어지는 것을 방지합니다. 오랫동안 통신이 끊긴 상황.

2. 서버는 하트비트를 통해 클라이언트가 온라인 상태인지 확인할 수 있습니다. 클라이언트가 지정된 시간 내에 데이터를 보내지 않으면 클라이언트는 오프라인으로 간주됩니다. 이는 극단적인 상황(정전, 네트워크 연결 끊김 등)으로 인해 클라이언트가 오프라인 상태가 되는 이벤트를 감지할 수 있습니다.

권장 하트비트 간격 값:

클라이언트가 60초 미만(예: 55초)의 하트비트 간격을 전송하는 것이 좋습니다.

예:

<?php
require_once __DIR__ . &#39;/Workerman/Autoloader.php&#39;;
use Workerman\Worker;
use Workerman\Lib\Timer;

// 心跳间隔55秒
define(&#39;HEARTBEAT_TIME&#39;, 55);

$worker = new Worker(&#39;text://0.0.0.0:1234&#39;);

$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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.