用swoole实现mysql的连接池--摘自https://github.com/153734009/doc/blob/master/php/mysql_pool.php

时间:2021-06-23 07:47:41
<?php   $serv = new swoole_server("0.0.0.0", 9508);   $serv->set(['worker_num'=>1, 'task_worker_num'=>5]);   function onReceive($serv, $fd, $from_id, $data)   {   $sql = $data;   $result = $serv->taskwait($sql);   if($result !== false){   $serv->send($fd, $result . "\n");   }else{   $serv->send($fd, "Err:Task timeout\n");   }   //异步的时候就麻烦了,需要把$fd传递到onFinish,才能send数据到   //$serv->task($sql);   }   /**   * task保持数据库连接   * 使用静态变量,因为变量没有释放,所以才能保持连接   * mysql连接的数量= task_worker_num   */   function onTask($serv, $fd, $from_id, $sql)   {   static $conn = null;   if($conn == null){   $conn = mysqli_connect('127.0.0.1', 'root', '123456', 'help');   if(!$conn){   $conn = null;   $serv->finish('ERR:'.mysqli_connect_error());   return;   }   }   $result = $conn->query($sql);   if(!$result){   $serv->finish('ERR:'.mysqli_error($conn));   return;   }   $data = $result->fetch_all(MYSQLI_ASSOC);   $serv->finish('OK:'.serialize($data));   }   function onFinish($serv, $task_id, $data)   {   // 异步Task时有效   echo "AsyncTask Finish:Connect.PID=".posix_getpid().PHP_EOL;   }   $serv->on('Receive', 'onReceive');   $serv->on('Task', 'onTask');   $serv->on('Finish', 'onFinish');   $serv->start();       //以下是客户端代码   //$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC); //同步阻塞   //$client->connect('172.18.107.194', 9508, 0.5, 0);   //$client->send("show tables");   //$data = $client->recv();       /**   * 查看mysql连接   *   * 1. mysql -uroot -p123456   * 2. show status;   * 其中的   * Threads_connected | 1   * 就是mysql连接数   */