swoole_server->defer

22 篇文章 1 订阅

简介

延后执行一个PHP函数。Swoole底层会在EventLoop循环完成后执行此函数。此函数的目的是为了让一些PHP代码延后执行,程序优先处理IO事件。底层不保证defer的函数会立即执行,如果是系统关键逻辑,需要尽快执行,请使用after定时器实现。

https://wiki.swoole.com/wiki/page/516.html

使用实例

function query($server, $db) {
    $server->defer(function() use ($db) {
        $db->close();
    });
}

注意事项

Server

<?php
class Server
{
    private $serv;
    public function __construct(){
        $this->serv = new swoole_server('127.0.0.1', 9501);//注意这里要用多进程模式,不填写默认是多进程
        $this->serv->set(array(
            'worker_num' => 4,
            'daemonize' => false,
            'backlog' => 128,
        ));
        $this -> query($this->serv);
        $this->serv->on('Connect', array($this,'onConnect'));
        $this->serv->on('Receive', array($this,'onReceive'));
        $this->serv->on('Close', array($this,'onClose'));
        $this->serv->start();
    }


    public function onConnect(swoole_server $server, int $fd, int $reactorId){
        //只能写在回调函数中
        $server->defer(function() use ($server) {
            print_r("我执行了");
        });         
        print_r($fd."--连接上了\n");   
    }

    public function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data){
        print_r("主进程\n");
        $server->after(5000,function() use ($server,$fd){
            $server->send($fd, "我是after");
        });
    }

    public function onClose(swoole_server $server, int $fd, int $reactorId){
        print_r($fd."--关闭了连接\n");
    }

    function query($server) {

    }
}

new Server();

Client

<?php 

$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, -1))
{
    exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("我是发送的数据\n");

while (true) {
    $as = $client->recv();
    print_r($as."\n");
}

结果

这里写图片描述

参考地址

https://wiki.swoole.com/wiki/page/516.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值