Utilisation de base de PHP Swoole

Guanhui
Libérer: 2023-04-08 16:00:01
avant
3330 Les gens l'ont consulté

Contexte

PHP est utilisé dans le projet, mais en raison de la tâche longue et fastidieuse, une fois le front-end soumis, le serveur doit répondre de manière asynchrone.

Il existe de nombreuses solutions pour les serveurs asynchrones, notamment MQ, fsocket, Swoole, etc.

Swoole est écrit en langage C pur et fournit un serveur multithread asynchrone en langage PHP, un client réseau TCP/UDP asynchrone, MySQL asynchrone, Redis asynchrone, un pool de connexions à la base de données, AsyncTask, une file d'attente de messages, un minuteur en millisecondes, asynchrone. lecture et écriture de fichiers, requête DNS asynchrone. Swoole a un serveur/client Http/WebSocket intégré et un serveur Http2.0.

Le plus important est qu'il supporte parfaitement le langage PHP. J'ai donc utilisé Swoole pour créer un serveur asynchrone afin de fournir une série de tâches telles que des réponses asynchrones, des tâches push et planifiées.

Installation

Swoole est écrit en langage C et utilise la compilation et l'installation.

Les dépendances d'installation sont :

php-5.3.10 ou version supérieure

gcc-4.4 ou version supérieure

make

autoconf

pcre (le système centos peut exécuter la commande : yum install pcre-devel)

Méthode d'installation :

phpize #Si la commande n'existe pas, veuillez ajouter php dans front Le chemin réel de

./configure

make

sudo make install

Une fois la compilation terminée, vous devez ajouter l'extension

extension=swoole.so

Utiliser

Serveur

class Server{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
 
            //'worker_num' => 1,  //一般设置为服务器CPU数的1-4倍
 
            'daemonize' => 1,  //以守护进程执行
            'max_request' => 10000,
            'task_worker_num' => 1,  //task进程的数量
 
            "task_ipc_mode " => 3 ,  //使用消息队列通信,并设置为争抢模式
            'open_length_check'    => true,
            'dispatch_mode'        => 1,
 
            'package_length_type'  => 'N',  //这个很关键,定位包头的
            'package_length_offset' => 0,      //第N个字节是包长度的值
            'package_body_offset'  => 4,      //第几个字节开始计算长度
 
            'package_max_length'    => 2000000,  //协议最大长度
            "log_file" => "/tmp/swoole_test.log"  //日志
 
        ));
 
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Task', array($this, 'onTask'));
        $this->serv->on('Finish', array($this, 'onFinish'));
        $this->serv->start();
 
    }
 
    public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
 
        //放入任务队列,开始执行
        $task_id = $serv->task( $data );
 
    }
 
    public function onTask($serv,$task_id,$from_id, $data) {
      //做一些事情
 
    }
Copier après la connexion

Client

class Client{
 
    private $client, $ip, $port, $params;
 
    public function __construct($ip, $port, $params)
    {
 
        $this->ip = $ip;
        $this->port = $port;
        $this->params = $params;
 
        $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
        $this->client->set(array(
            'open_length_check'    => true,
            'package_length_type'  => 'N',
            'package_length_offset' => 0,      //第N个字节是包长度的值
            'package_body_offset'  => 4,      //第几个字节开始计算长度
            'package_max_length'    => 2000000,  //协议最大长度
 
        ));
 
        //设置事件回调函数
 
        $this->client->on('Connect', array($this, 'onConnect'));
        $this->client->on('Receive', array($this, 'onReceive'));
        $this->client->on('Close', array($this, 'onClose'));
        $this->client->on('Error', array($this, 'onError'));
 
        //发起网络连接
        $this->client->connect($ip, $port, 3);
    }
 
    public function onReceive( $cli, $data ) {
        echo "Received: " . $data . "\n";
 
    }
 
    public function onConnect($cli) {
 
        $data = pack('N', strlen($data)) . $data;
        $cli->send($data);
        $cli->close();
 
    }
 
    public function onClose( $cli)
    {
        echo "Connection close\n";
    }
 
    public function onError()
    {
        echo "Connect failed\n";
    }
 
}
Copier après la connexion

Problèmes d'attention

'open_length_check'    => true,
'package_length_type'  => 'N',
'package_length_offset' => 0,      //第N个字节是包长度的值
'package_body_offset'  => 4,      //第几个字节开始计算长度
'package_max_length'    => 2000000,  //协长度
Copier après la connexion

Ceux-ci sont utilisés pour définir la délimitation des trames. Étant donné que le client et le serveur de Swoole communiquent via des connexions TCP, les délimiteurs de trames doivent être fournis. Il existe plusieurs méthodes de délimitation des trames. Veuillez vous référer à la documentation officielle de Swoole pour plus de détails. Voici une façon d’ajouter de la longueur avec la tête.

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!