- EasySwoole中使用异步客户端
- 纯原生异步
- 伪异步-eventLoop
- 伪异步-socket select
EasySwoole中使用异步客户端
为方便查看代码,本文没有使用自定义进程类模板,如果需要开发,可查看自定义进程 在run方法里面使用异步客户端
请不要直接在worker进程使用自定义进程,否则将出现问题
纯原生异步
public static function mainServerCreate(EventRegister $register){// //纯原生异步ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){$client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);$client->on("connect", function(\swoole_client $cli) {$cli->send("test:delay");});$client->on("receive", function(\swoole_client $cli, $data){echo "Receive: $data";$cli->send("test:delay");sleep(1);});$client->on("error", function(\swoole_client $cli){echo "error\n";});$client->on("close", function(\swoole_client $cli){echo "Connection close\n";});$client->connect('192.168.159.1', 9502);//本demo自定义进程采用的是原生写法,如果需要使用,请使用自定义进程类模板开发if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码pcntl_async_signals(true);}Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码$worker->exit(0);});}));}
伪异步-eventLoop
利用swoole自带的事件循环,实现异步
public static function mainServerCreate(EventRegister $register){ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){$client = new \swoole_client(SWOOLE_SOCK_TCP);$client->connect('192.168.159.1', 9502);//该出send是为了触发服务端主动返回消息,方便直观测试$client->send("test:delay");swoole_event_add($client->sock,function()use($client){//服务端中,在\Tcp\Parser中,因为你发test:delay命令,是依旧会先给你返回\n,因此请做下空判定$data = trim($client->recv());if(!empty($data)){var_dump('rec from ser');$client->send("test:delay");}});//本demo自定义进程采用的是原生写法,如果需要使用,请使用上文的自定义进程类模板开发if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码pcntl_async_signals(true);}Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码$worker->exit(0);});}));}
伪异步-socket select
public static function mainServerCreate(EventRegister $register){ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){$client = new \swoole_client(SWOOLE_SOCK_TCP);$client->connect('192.168.159.1', 9502);//该出send是为了触发服务端主动返回消息,方便直观测试$client->send("test:delay");Timer::loop(100,function ()use($client){$write = $error = array();$read = [$client];$n = swoole_client_select($read, $write, $error, 0.01);if($n > 0){$data = trim($client->recv());if(!empty($data)){$client->send("test:delay");var_dump('rec:'.$data);}}});//本demo自定义进程采用的是原生写法,如果需要使用,请使用上文的自定义进程类模板开发if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码pcntl_async_signals(true);}Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码$worker->exit(0);});}));}
