Grundlegende Verwendung von PHP Swoole

Guanhui
Freigeben: 2023-04-08 16:00:01
nach vorne
3341 Leute haben es durchsucht

Hintergrund

PHP wird im Projekt verwendet, aber aufgrund der langen und zeitaufwändigen Aufgabe muss der Server nach der Übermittlung des Front-Ends asynchron reagieren.

Es gibt viele Lösungen für asynchrone Server, einschließlich MQ, fsocket, Swoole usw.

Swoole ist in reiner C-Sprache geschrieben und bietet asynchronen Multithread-Server in PHP-Sprache, asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL, asynchrones Redis, Datenbankverbindungspool, AsyncTask, Nachrichtenwarteschlange, Millisekunden-Timer, Asynchron Lesen und Schreiben von Dateien, asynchrone DNS-Abfrage. Swoole verfügt über einen integrierten HTTP/WebSocket-Server/Client und einen HTTP2.0-Server.

Das Wichtigste ist, dass es die PHP-Sprache perfekt unterstützt. Deshalb habe ich mit Swoole einen asynchronen Server erstellt, der eine Reihe von Aufgaben wie asynchrone Antworten, Push und geplante Aufgaben bereitstellt.

Installation

Swoole ist in der Sprache C geschrieben und verwendet Kompilierung und Installation.

Die Installationsabhängigkeiten sind:

php-5.3.10 oder höhere Version

gcc-4.4 oder höhere Version

make

autoconf

pcre (Centos-System kann den Befehl ausführen: yum install pcre-devel)

Installationsmethode:

phpize #Wenn der Befehl nicht vorhanden ist, fügen Sie bitte PHP hinzu front Der tatsächliche Pfad von

./configure

make

sudo make install

Nachdem die Kompilierung abgeschlossen ist, müssen Sie die Erweiterung extension=swoole.so

Verwenden Sie

Server

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

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";
    }
 
}
Nach dem Login kopieren

Achtung

'open_length_check'    => true,
'package_length_type'  => 'N',
'package_length_offset' => 0,      //第N个字节是包长度的值
'package_body_offset'  => 4,      //第几个字节开始计算长度
'package_max_length'    => 2000000,  //协长度
Nach dem Login kopieren

Diese werden zur Definition der Frame-Trennung verwendet. Da Swooles Client und Server über TCP-Verbindungen kommunizieren, müssen mehrere Frame-Trennungsmethoden angegeben werden. Hier ist eine Möglichkeit, mit dem Kopf Länge hinzuzufügen.

Das obige ist der detaillierte Inhalt vonGrundlegende Verwendung von PHP Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage