Home  >  Article  >  PHP Framework  >  Why did swoole go from getting started to giving up?

Why did swoole go from getting started to giving up?

coldplay.xixi
coldplay.xixiforward
2020-12-09 17:37:263639browse

swoole tutorialIntroducing why from getting started to giving up

Why did swoole go from getting started to giving up?

Recommended (free): swoole tutorial

1. swoole source package installation

  1. Download the swoole source code: git clone https://gitee.com/swoole/swoole.git
  2. Through phpize (extend php extension module, create php plug-in module):

    • cd swoole
    • Execute: your /phpize/path
    • ./configure --with-php-config=your/php/path/bin/php-config
    • ## make && make install
  3. You can see the location of swoole.so

      My location is:
    • /opt/ soft/php/lib/php/extensions/no-debug-non-zts-20170718/
  4. Configure php.ini

      Add
    • extension=swoole.so
  5. Through the
  6. php -m command, you can see the php extension module
  7. Detect that swoole is installed successfully and php supports swoole

    • cd your/swoole/path/examples/server
    • php echo.php (If the process is blocked, it means success)
    • netstat -anp | grep 9501 (View the port number opened by swoole)

2. Network Communication Engine

To learn swoole, you need to read the documents. swoole document
1. Create the simplest tcp service through swoole

tcp server (tcp_server.php)
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);

$serv->set([
    'worker_num' => 4, // worker进程数,cpu 1-4倍
    'max_request' => 100,
]);

/**
 * 监听连接进入事件
 * $fd 客户端连接服务端的唯一标识
 * $reactor_id 线程id
 */
$serv->on('connect', function ($serv, $fd, $reactor_id) {
    echo "Client: {$fd} - {$reactor_id} - Connect.\n";
});

//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
    $serv->send($fd, "Server: ".$data);
});

//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

//启动服务器
$serv->start();
tcp client (tcp_client.php)
// 创建tcp客户端
$client = new swoole_client(SWOOLE_SOCK_TCP);

// 连接tcp服务端
if (!$client->connect("127.0.0.1", 9501)) {
    echo '连接失败';
    exit;
}

// php cli
fwrite(STDOUT, '请输入:');
$msg = trim(fgets(STDIN));

// 发送消息给tcp服务端
if (!$client->send($msg)) {
    echo '发送消息失败';
    exit;
}

// 接收
$result = $client->recv();
echo $result;
2. Expansion: Four callbacks of php

  • Anonymous function
$server->on('Request', function ($req, $resp) {
    echo "hello world";
});
  • Class static method
class A
{
    static function test($req, $resp)
    {
        echo "hello world";
    }
}
$server->on('Request', 'A::Test');
$server->on('Request', array('A', 'Test'));
  • Function
function my_onRequest($req, $resp)
{
    echo "hello world";
}
$server->on('Request', 'my_onRequest');
  • Object method
class A
{
    function test($req, $resp)
    {
        echo "hello world";
    }
}

$object = new A();
$server->on('Request', array($object, 'test'));
Tips: View the opened worker process: ps aft | grep tcp_server.php

3. UDP server and client You can create it yourself according to the document


4. http service

// 监听所有地址和9501端口
$http = new swoole_http_server('0.0.0.0', 9501);

// 动静分离配置
$http->set([
    // 开启静态请求
    'enable_static_handler' => true,
    // 静态资源目录
    'document_root' => '/opt/app/code1/',
]);

$http->on('request', function ($request, $response) {
    // 获取get请求的参数
    $param = json_encode($request->get);
    // 设置cookie
    $response->cookie('name', 'ronaldo', time() + 1800);
    // 输出到页面
    $response->end("<h1>Hello Swoole - {$param}</h1>");
});

// 开启http服务
$http->start();


5. Create websocket service through swoole

websocket server (websocket_server.php)
// 监听所有地址和9502端口
$server = new swoole_websocket_server('0.0.0.0', 9502);

// 动静分离配置
$server->set([
    // 开启静态请求
    'enable_static_handler' => true,
    // 静态资源目录
    'document_root' => '/opt/app/swoole/websocket',
]);
$server->on('open', function ($server, $request) {
    echo "server:handshake success with fd - {$request->fd}\n";
});

$server->on('message', function ($server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    $server->push($frame->fd, "this is server");
});

$server->on('close', function ($server, $fd) {
    echo "client - {$fd} - close\n";
});

$server->start();
websocket client (websockt_client.html)
// 创建websocket实例
        var websocketURL = "ws://www.rona1do.top:9502";
        var websocket = new WebSocket(websocketURL);

        // 实例化对象的onopen属性
        websocket.onopen = function (ev) {
            websocket.send("hello-websocket");
            console.log("connect-swoole-success");
        }

        // 实例化对象的onmessage属性,接收服务端返回的数据
        websocket.onmessage = function (ev) {
            console.log("websockect-server-return-data:" + ev.data);
        }

        // close
        websocket.onclose = function (ev) {
            console.log("close");
        }

6. Use object-oriented to optimize websocket service code

class WebSocket {
    const HOST = '0.0.0.0';
    const PORT = 9502;

    private $ws = null;

    function __construct()
    {
        $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        $this->ws->on('close', [$this, 'onClose']);
        $this->ws->start();
    }

    // 监听websocket连接事件
    function onOpen($server, $request) {
        echo "server: handshake success with fd{$request->fd}\n";
    }

    // 监听websocket消息接收事件
    function onMessage($server, $frame) {
        echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
        $server->push($frame->fd, "this is server");
    }

    // 监听客户端关闭事件
    function onClose($server, $fd) {
        echo "Client:{$fd} closes\n";
    }
}


7. Task in swoole Small case

onTask: is called within the task_worker process. The worker process can use the swoole_server_task function to deliver new tasks to the task_worker process. When the current Task process calls the onTask callback function, it will switch the process status to busy and will no longer receive new tasks. When the onTask function returns, it will switch the process status to idle and continue to receive new tasks.
onFinish: When the task delivered by the worker process is completed in task_worker, the task process will send the task processing result to the worker process through the swoole_server->finish() method.
class Websocket {

    const HOST = '0.0.0.0';
    const PORT = 9502;
    private $ws = null;

    public function __construct()
    {
        $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
        $this->ws->set([
            'worker_num' => 2,
            'task_worker_num' => 2, // 要想使用task必须要指明
        ]);
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        $this->ws->on('task', [$this, 'onTask']);
        $this->ws->on('finish', [$this, 'onFinish']);
        $this->ws->on('close', [$this, 'onClose']);
        $this->ws->start();
    }

    public function onOpen($server, $request)
    {
        echo "server:handshake success with fd:{$request->fd}\n";
    }

    public function onMessage($server, $frame)
    {
        echo "receive from {$frame->fd}:{$frame->data}\n";

        // 需要投递的任务数据
        $data = [
            'fd' => $frame->fd,
            'msg' => 'task',
        ];
        $server->task($data);

        $server->push($frame->fd, 'this is server');
    }

    // 处理投递的任务方法,非阻塞
    public function onTask($server, $task_id, $worker_id, $data)
    {
        print_r($data);
        // 模拟大量数据的操作
        sleep(10);
        return "task_finish";
    }
    
    // 投递任务处理完毕调用的方法
    public function onFinish($server, $task_id, $data)
    {
        echo "task_id:{$task_id}\n";
        echo "task finish success:{$data}\n";
    }
    
    public function onClose($server, $fd)
    {
        echo "Client:close";
    }
}

The above is the detailed content of Why did swoole go from getting started to giving up?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:csdn.net. If there is any infringement, please contact admin@php.cn delete