直接上代码
服务端代码(server.php)
<?php /* swoole Task运行实例 Task简介 Swoole的业务逻辑部分是同步阻塞运行的,如果遇到一些耗时较大的操作,例如访问数据库、广播消息等,就会影响服务器的响应速度。因此Swoole提供了Task功能,将这些耗时操作放到另外的进程去处理,当前进程继续执行后面的逻辑. 运行Task,需要在swoole服务中配置参数 task_worker_num,即可开启task功能。此外,必须给swoole_server绑定两个回调函数:onTask和onFinish。这两个回调函数分别用于执行Task任务和处理Task任务的返回结果。 */ class server { private $serv; /** * [__construct description] * 构造方法中,初始化 $serv 服务 */ public function __construct() { $this->serv = new swoole_server(‘0.0.0.0‘, 9501); //初始化swoole服务 $this->serv->set(array( ‘worker_num‘ => 8, ‘daemonize‘ => false, //是否作为守护进程,此配置一般配合log_file使用 ‘max_request‘ => 1000, ‘log_file‘ => ‘./swoole.log‘, ‘task_worker_num‘ => 8 )); //设置监听 $this->serv->on(‘Start‘, array($this, ‘onStart‘)); $this->serv->on(‘Connect‘, array($this, ‘onConnect‘)); $this->serv->on("Receive", array($this, ‘onReceive‘)); $this->serv->on("Close", array($this, ‘onClose‘)); $this->serv->on("Task", array($this, ‘onTask‘)); $this->serv->on("Finish", array($this, ‘onFinish‘)); //开启 $this->serv->start(); } public function onStart($serv) { echo SWOOLE_VERSION . " onStart\n"; } public function onConnect($serv, $fd) { echo $fd."Client Connect.\n"; } public function onReceive($serv, $fd, $from_id, $data) { echo "Get Message From Client {$fd}:{$data}\n"; // send a task to task worker. $param = array( ‘fd‘ => $fd ); // start a task $serv->task(json_encode($param)); echo "Continue Handle Worker\n"; } public function onClose($serv, $fd) { echo "Client Close.\n"; } public function onTask($serv, $task_id, $from_id, $data) { echo "This Task {$task_id} from Worker {$from_id}\n"; echo "Data: {$data}\n"; for($i = 0 ; $i < 2 ; $i ++ ) { sleep(1); echo "Task {$task_id} Handle {$i} times...\n"; } $fd = json_decode($data, true); $serv->send($fd[‘fd‘] , "Data in Task {$task_id}"); return "Task {$task_id}‘s result"; } public function onFinish($serv,$task_id, $data) { echo "Task {$task_id} finish\n"; echo "Result: {$data}\n"; } } $server = new server();
客户端代码(client.php)
<?php class Client { private $client; public function __construct() { $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); $this->client->on(‘Connect‘, array($this, ‘onConnect‘)); $this->client->on(‘Receive‘, array($this, ‘onReceive‘)); $this->client->on(‘Close‘, array($this, ‘onClose‘)); $this->client->on(‘Error‘, array($this, ‘onError‘)); } public function connect() { if(!$fp = $this->client->connect("127.0.0.1", 9501 , 1)) { echo "Error: {$fp->errMsg}[{$fp->errCode}]\n"; return; } } //connect之后,会调用onConnect方法 public function onConnect($cli) { fwrite(STDOUT, "Enter Msg:"); swoole_event_add(STDIN,function(){ fwrite(STDOUT, "Enter Msg:"); $msg = trim(fgets(STDIN)); $this->send($msg); }); } public function onClose($cli) { echo "Client close connection\n"; } public function onError() { } public function onReceive($cli, $data) { echo "Received: ".$data."\n"; } public function send($data) { $this->client->send($data); } public function isConnected($cli) { return $this->client->isConnected(); } } $client = new Client(); $client->connect();
运行服务端: php server.php
运行客户端: php client.php
结果:
服务端
客户端:
时间: 2024-10-02 23:07:51