• EasySwoole中使用异步客户端
    • 纯原生异步
    • 伪异步-eventLoop
    • 伪异步-socket select

    EasySwoole中使用异步客户端

    为方便查看代码,本文没有使用自定义进程类模板,如果需要开发,可查看自定义进程 在run方法里面使用异步客户端

    请不要直接在worker进程使用自定义进程,否则将出现问题

    纯原生异步

    1. public static function mainServerCreate(EventRegister $register)
    2. {
    3. // //纯原生异步
    4. ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){
    5. $client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
    6. $client->on("connect", function(\swoole_client $cli) {
    7. $cli->send("test:delay");
    8. });
    9. $client->on("receive", function(\swoole_client $cli, $data){
    10. echo "Receive: $data";
    11. $cli->send("test:delay");
    12. sleep(1);
    13. });
    14. $client->on("error", function(\swoole_client $cli){
    15. echo "error\n";
    16. });
    17. $client->on("close", function(\swoole_client $cli){
    18. echo "Connection close\n";
    19. });
    20. $client->connect('192.168.159.1', 9502);
    21. //本demo自定义进程采用的是原生写法,如果需要使用,请使用自定义进程类模板开发
    22. if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码
    23. pcntl_async_signals(true);
    24. }
    25. Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码
    26. $worker->exit(0);
    27. });
    28. }));
    29. }

    伪异步-eventLoop

    利用swoole自带的事件循环,实现异步

    1. public static function mainServerCreate(EventRegister $register)
    2. {
    3. ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){
    4. $client = new \swoole_client(SWOOLE_SOCK_TCP);
    5. $client->connect('192.168.159.1', 9502);
    6. //该出send是为了触发服务端主动返回消息,方便直观测试
    7. $client->send("test:delay");
    8. swoole_event_add($client->sock,function()use($client){
    9. //服务端中,在\Tcp\Parser中,因为你发test:delay命令,是依旧会先给你返回\n,因此请做下空判定
    10. $data = trim($client->recv());
    11. if(!empty($data)){
    12. var_dump('rec from ser');
    13. $client->send("test:delay");
    14. }
    15. });
    16. //本demo自定义进程采用的是原生写法,如果需要使用,请使用上文的自定义进程类模板开发
    17. if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码
    18. pcntl_async_signals(true);
    19. }
    20. Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码
    21. $worker->exit(0);
    22. });
    23. }));
    24. }

    伪异步-socket select

    1. public static function mainServerCreate(EventRegister $register)
    2. {
    3. ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){
    4. $client = new \swoole_client(SWOOLE_SOCK_TCP);
    5. $client->connect('192.168.159.1', 9502);
    6. //该出send是为了触发服务端主动返回消息,方便直观测试
    7. $client->send("test:delay");
    8. Timer::loop(100,function ()use($client){
    9. $write = $error = array();
    10. $read = [$client];
    11. $n = swoole_client_select($read, $write, $error, 0.01);
    12. if($n > 0){
    13. $data = trim($client->recv());
    14. if(!empty($data)){
    15. $client->send("test:delay");
    16. var_dump('rec:'.$data);
    17. }
    18. }
    19. });
    20. //本demo自定义进程采用的是原生写法,如果需要使用,请使用上文的自定义进程类模板开发
    21. if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码
    22. pcntl_async_signals(true);
    23. }
    24. Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码
    25. $worker->exit(0);
    26. });
    27. }));
    28. }