Maison  >  Article  >  développement back-end  >  Utilisation de base de PHP Swoole

Utilisation de base de PHP Swoole

Guanhui
Guanhuiavant
2020-05-06 09:38:153351parcourir

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) {
      //做一些事情
 
    }

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";
    }
 
}

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,  //协长度

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer