Maison  >  Article  >  cadre php  >  Comment utiliser le rythme cardiaque des travailleurs

Comment utiliser le rythme cardiaque des travailleurs

(*-*)浩
(*-*)浩original
2019-12-02 10:32:224286parcourir

Comment utiliser le rythme cardiaque des travailleurs

Le modèle de développement Gateway/Worker prend en charge la détection des battements de cœur côté serveur, qui peut envoyer régulièrement des battements de cœur de la couche d'application au client et détecter rapidement les déconnexions extrêmes du client (pannes de courant) , panne réseau soudaine, etc.).

Remarque : Les applications à connexion longue doivent ajouter un battement de cœur, sinon la connexion peut être déconnectée de force par le nœud de routage en raison d'une absence de communication pendant une longue période. (Apprentissage recommandé : Tutoriel Workerman )

Le battement de coeur a deux fonctions principales :

1. Le client envoie régulièrement des données de points au serveur, Empêchez la fermeture de la connexion par le pare-feu de certains nœuds en raison d'une absence de communication pendant une longue période, entraînant la déconnexion de la connexion.

2. Le serveur peut déterminer si le client est en ligne via Heartbeat. Si le client n'envoie aucune donnée dans le délai spécifié, il est considéré comme hors ligne. Cela peut détecter les événements où le client se déconnecte en raison de circonstances extrêmes (panne de courant, déconnexion du réseau, etc.).

Valeur d'intervalle de battement de coeur recommandée :

Il est recommandé au client d'envoyer un intervalle de battement de coeur de moins de 60 secondes, par exemple 55 secondes.

Exemple :

<?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();

La configuration ci-dessus est que si le client n'envoie aucune donnée au serveur pendant plus de 55 secondes, le serveur pensera que le client a été hors ligne. Fermez la connexion et déclenchez onClose.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn