Maison  >  Article  >  développement back-end  >  Quels sont les scénarios d’application pour utiliser swoole en PHP ?

Quels sont les scénarios d’application pour utiliser swoole en PHP ?

coldplay.xixi
coldplay.xixioriginal
2020-07-01 15:51:483671parcourir

Les scénarios d'application de PHP utilisant swoole sont : 1. Collecte en temps réel des données de positionnement et sortie en temps réel Il est nécessaire de recevoir tous les appareils de positionnement en temps réel et d'afficher les enregistrements de suivi en temps réel sur le. carte ; 2. Collecter uniquement les appareils de positionnement. Pour stocker, les données téléchargées par tous les appareils de positionnement doivent être stockées dans la base de données.

Quels sont les scénarios d’application pour utiliser swoole en PHP ?

Les scénarios d'application de php utilisant swoole sont :

Scénario 1 - Collecte en temps réel de données de positionnement et sortie en temps réel (exemple de trajectoire de conduite du conducteur Didi)

Remarque :

Il est nécessaire de recevoir tous les appareils de positionnement en temps réel et d'afficher les enregistrements de trajectoire en temps réel sur la carte

Remarque :

Le premier point :

Les utilisateurs 1, 2, 3 connectés au serveur web1, web1 ne peut diffuser que les utilisateurs 1 , 2, 3 lors de la diffusion d'informations. Les utilisateurs 4, 5 et 6 ne peuvent pas diffuser les connexions Web2. Supposons que la scène discute. Seuls les utilisateurs du serveur Web1 peuvent le voir. .

Deuxième point : message Contrôle de fréquence, par exemple : 100 appareils, 100 utilisateurs, 100 appareils téléchargent une donnée par seconde, qui doit être diffusée à chaque utilisateur en temps réel, soit 100*. 100 = 1 W fois par seconde, de sorte que les données par seconde peuvent être résumées et diffusées à tous les utilisateurs et autres méthodes

Quels sont les scénarios d’application pour utiliser swoole en PHP ?

Scénario 2 - Collecter uniquement les appareils de positionnement dans le base de données

Instructions : Tous les appareils de positionnement doivent être téléchargés. Les données sont stockées dans la base de données, avec 7 appareils et une donnée par seconde. J'utilise personnellement la fonction de tâche de swoole (livrer une tâche asynchrone pour. le pool task_worker. Cette fonction est non bloquante et le nombre de processus de travail peut également être configuré) puis appelle l'interface pour stocker les données dans la base de données

Problème d'alarme de mémoire du serveur

. Cause : La swoole_server->task fonction

introduit officiellement que la couche inférieure de la tâche utilise la communication par canal Unix Socket, qui est une mémoire pleine et n'a aucune consommation d'E/S. Les performances de lecture et d'écriture d'un seul processus peuvent atteindre 1 million/s. Différents processus utilisent différents pipelines pour communiquer, ce qui peut maximiser l'utilisation de plusieurs cœurs.

Mais si la tâche consiste à appeler l'interface du programme, en raison du retard du réseau, lorsque les tâches ajoutées sont plus volumineuses que les tâches consommées, l'utilisation de la mémoire continuera d'augmenter, provoquant une saturation de la mémoire du serveur.

Solution : Contrôlez la fréquence des messages entrant dans la tâche. Vous pouvez définir cette heure et si elle peut être retardée en fonction de votre propre scénario commercial, résumer toutes les données en 1 seconde, puis appeler l'interface du programme (je utilisez personnellement Redis lors du résumé), il est préférable de le stocker directement dans la bibliothèque sans appeler l'interface

Extraits de code simples

function __construct($config) 
{
    $this->config = $config;
    $this->serv = new Swoole\Server($config['server']['host'], $config['server']['port']);
    // 连接redis
    $this->redis = new Predis\Client($config['redis']);
    $this->storage = new Storage($this->config);
    $this->serv->set([
        'worker_num'      => $this->config['server']['workerNum'],   //工作进程数量
        'daemonize'       => $this->config['server']['daemonize'], //是否作为守护进程
        'task_worker_num' => $this->config['server']['taskWorkerNum'],
    ]);
    $this->serv->on('connect', function ($serv, $fd){
        $this->onConnect($fd, $serv);
    });
    
    $this->serv->on('receive', function ($serv, $fd, $from_id, $data)  {
        $this->onReceive($fd, $serv, $data);
    });
    $this->serv->on('Close', function($server, $fd) {
        $this->onClose($fd, $server);
        
    });
    $this->serv->on('Task', function($server, $task_id, $from_id, $data) {
        $this->onTask($server, $task_id, $from_id, $data);
        
    });
    $this->serv->on('Finish', function($server, $task_id, $data) {
        $this->onFinish($server, $task_id, $data);
        
    });
    $this->serv->start();
}
public function onTask($serv, $task_id, $from_id, $data){
    // insert 方法是通过接口入库
    $this->storage->insert($data);
}
public function onReceive($fd, $serv, $data)
{
    $this->storage->writeLog('message:'.$data);
    $data = $this->formatData($data, $fd);
    $serv->task($data);
}
public function onClose($fd, $serv) 
{
    // writeLog 方法是写入log
    $this->storage->writeLog('close fd:'.$fd);
}
public function onFinish($serv, $task_id, $data)
{
    return '';
}

Recommandations d'apprentissage associées : Programmation PHP de entrée en compétence

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