swoole 异步非堵塞 server/端 client/端 代码,已经测试完毕。

发布时间 2023-04-03 17:27:18作者: xyz叶子

 

服务器环境  centos7.0  swoole4.3 php7.2 pcre4.8  nginx1.8   php-fpm

server.php

 

复制代码
<?php 

class Server
{
    private $serv;

    public function __construct() {

        $this->serv = new swoole_server("0.0.0.0", 9501);

        $this->serv->set(array(
            'worker_num' => 8,
            'daemonize' => false,
            'max_request' => 10000,
            'dispatch_mode' => 2,
            'debug_mode'=> 1
        ));

        $this->serv->on('Start', array($this, 'onStart'));
        $this->serv->on('Connect', array($this, 'onConnect'));
        //$this->serv->on('Message', array($this, 'onMessage'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));

        $this->serv->start();
    }

    public function onStart( $serv ) {
        echo "Start\n";
    }

    public function onConnect( $serv, $fd, $from_id ) {
        $serv->send( $fd, "收到 {$fd}!" );
    }

    // public function onMessage( $serv, $fd, $from_id ) {
    //     $serv->send( $fd, "Hello {$fd}!我已经收到你的信息" );
    // }

    public function onReceive( $serv, $fd, $from_id, $data ) {
        echo "Get Message From Client {$fd}:{$data}\n";

        $serv->send( $fd, "Hello {$fd}!我收到了你的信息!{$data}" );

    }

    public function onClose( $serv, $fd, $from_id ) {
        echo "Client {$fd} close connection\n";
    }
}
// 启动服务器
$server = new Server();

?>
复制代码

client.php  异步 非阻塞

复制代码
<?php

$client = new swoole_client(SWOOLE_TCP | SWOOLE_ASYNC); //异步非阻塞

$client->on("connect", function($cli) {
    $cli->send("hello world\n");
});

$client->on("receive", function($cli, $data) {

    echo "received: $data\n";
    //sleep(1);
    fwrite(STDOUT, "请输入消息:");  
            
    $msg = trim(fgets(STDIN));

    $cli->send( $msg );
});

$client->on("close", function($cli){
    echo "closed\n";
});

$client->on("error", function($cli){
    exit("error\n");
});

$client->connect('0.0.0.0', 9501, 0.5);



?>
复制代码

测试 结果

 

      

 

同步,异步,阻塞和非阻塞 ----概念

 

同步,异步,阻塞和非阻塞,会组合成上面提到过的四种结果:

(一)同步+阻塞

(二)同步+非阻塞

(三)异步+阻塞

(四)异步+非阻塞

举个例子,比如我们去照相馆拍照,拍完照片之后,商家说需要30分钟左右才能洗出来照片,

这个时候如果我们一直在店里面啥都不干,一直等待商家面前等待它洗完照片,这个过程就叫同步阻塞。

当然大部分人很少这么干,更多的是大家拿起手机开始看电视,看一会就会问老板洗完没,老板说没洗完,然后我们接着看,再过一会接着问,直到照片洗完,这个过程就叫同步非阻塞。

因为店里生意太好了,越来越多的人过来拍,店里面快没地方坐了,老板说你把你手机号留下,我一会洗好了就打电话告诉你过来取,然后你去外面找了一个长凳开始躺着睡觉等待老板打电话,啥不都干,这个过程就叫异步阻塞。

当然实际情况是,大家可能会直接先去逛街或者吃饭做其他的活动,这样以来两不耽误,这个过程就叫异步非阻塞