Home >PHP Framework >Swoole >How to use PHP swoole

How to use PHP swoole

(*-*)浩
(*-*)浩Original
2019-12-16 09:08:153460browse

How to use PHP swoole

PHP is used in the project, but due to the long and time-consuming task, after the front-end is submitted, the server needs to respond asynchronously.

There are many solutions for server asynchronous, including MQ, fsocket, Swoole, etc. (Recommended learning: swoole video tutorial)

Swoole is written in pure C language and provides an asynchronous multi-threaded server in PHP language, asynchronous TCP/UDP network client, asynchronous MySQL, asynchronous Redis , database connection pool, AsyncTask, message queue, millisecond timer, asynchronous file reading and writing, asynchronous DNS query. Swoole has built-in Http/WebSocket server/client and Http2.0 server.

The most important thing is that it perfectly supports the PHP language. So I used Swoole to build an asynchronous server to provide a series of tasks such as asynchronous response, push, and scheduled tasks.

Swoole is written in C language and is compiled and installed.

The installation dependencies are:

php-5.3.10 或更高版本
gcc-4.4 或更高版本
make
autoconf
pcre (centos系统可以执行命令:yum install pcre-devel)

Installation method:

phpize #如果命令不存在 请在前面加上php的实际路径
./configure
make 
sudo make install

After compilation is completed, you need to install php Add extension to .ini

extension=swoole.so

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

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

The above is the detailed content of How to use PHP swoole. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn