网站规划分析的好处,电脑如何免费安装wordpress,查询网站死链接,网址查询关于使用Easyswoole 自定义MYSQL 连接池,一段时间后,操作接口,报数据库连接错误,然后在请求接口,就正常了
首先我们来看看对应的easyswoole 数据库注册
Config/Mysq.php
$mysql[mysql] [];
$mysql[mysql][default] [name default,host 127.0.0.1,port 330…关于使用Easyswoole 自定义MYSQL 连接池,一段时间后,操作接口,报数据库连接错误,然后在请求接口,就正常了
首先我们来看看对应的easyswoole 数据库注册
Config/Mysq.php
$mysql[mysql] [];
$mysql[mysql][default] [name default,host 127.0.0.1,port 3306,user test,password 122355666,database test,timeout 5,charsset utf8,// 以下是连接池属性intervalCheckTime 5,// 定时器执行频率 用于定时执行连接池对象回收,创建操作maxIdleTime 5, // 连接池对象最大闲置时间(秒)minObjectNum 5, // 连接池最小连接数maxObjectNum 30, // 连接池最大连接数getObjectTimeout 8.0, //autoPing 8,// 间隔自动 ping的时间
];
return $mysql;
我们在对应的地方进行连接池与数据对象的编写
App/Pool
MysqliPool.php
?phpnamespace App\Pool;use EasySwoole\Pool\AbstractPool;
use EasySwoole\Pool\Config;
use EasySwoole\Pool\Exception\Exception;class MysqliPool extends AbstractPool
{public function __construct(Config $conf){try {parent::__construct($conf);} catch (Exception $e) {}}// 创建对象protected function createObject(){// TODO: Implement createObject() method.return new MysqliObject();}
}
MysqliObject.php
?phpnamespace App\Pool;use EasySwoole\EasySwoole\Config;
use EasySwoole\Mysqli\Client;
use EasySwoole\Pool\ObjectInterface;
use EasySwoole\Pool\Manager;class MysqliObject extends Client implements ObjectInterface {const TYPE default;public function __construct() {$mysqlConfig Config::getInstance()-getConf(mysql.default);parent::__construct(new \EasySwoole\Mysqli\Config($mysqlConfig));}// 被连接池 unset 的时候执行public function gc() {// TODO: Implement gc() method.$this-close();}// 被连接池 回收的时候执行public function objectRestore() {// TODO: Implement objectRestore() method.}// 取出连接池的时候被调用若返回false则当前对象被弃用回收public function beforeUse(): ?bool {// TODO: Implement beforeUse() method.return true;}/*** 个人创建的方法 用于 获取连接池的连接*/public static function borrowPool(): ?MysqliObject {try {return Manager::getInstance()-get(self::TYPE)-getObj(500, 6);} catch (\Throwable $e) {\EasySwoole\EasySwoole\Trigger::getInstance()-error(获取连接失败);}}/*** 个人创建方法 用于 归还连接*/public static function returnPool(?MysqliObject $client) {try {Manager::getInstance()-get(self::TYPE)-recycleObj($client);} catch (\Throwable $e) {//\EasySwoole\EasySwoole\Trigger::getInstance()-error(归还连接失败);}}
}注册文件
EasySwooleEvent.php
?phpnamespace EasySwoole\EasySwoole;use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Config;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use App\Exception\ExceptionHandler;
use EasySwoole\Component\Di;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use App\WebSocket\WebSocketEvents;
use App\WebSocket\WebSocketParser;class EasySwooleEvent implements Event {public static function initialize() {date_default_timezone_set(Asia/Shanghai);// 加载Config下所有配置self::loadConfig();//注册mysqli连接池self::InitMysql();}public static function loadConfig() {Config::getInstance()-loadDir(EASYSWOOLE_ROOT . /Config);//print_r(Config::getInstance()-getConf());}public static function InitMysql() {$mysqliPoolConfig new \EasySwoole\Pool\Config([// 获取连接最大等待时间maxIdleTime 10,// 最小连接数minObjectNum 20,// 最大连接数maxObjectNum 1000,// 获取连接超时时间getObjectTimeout 65,]);try {\EasySwoole\Pool\Manager::getInstance()-register(new \App\Pool\MysqliPool($mysqliPoolConfig),\App\Pool\MysqliObject::TYPE);} catch (Throwable $e) {echo 系统启动时注册mysql异常 Msg:{$e-getMessage()} . \n;};}
}然后我们这里写一个接口 然后去调用 结果发现其会报MYSQL 2006 连接超时的问题
于是乎找了一个方法 就是在取出连接池的时候 进行一个连接判断,若连接取出前进行一个连接判断 就可以避免上述问题
此刻我们修改MysqliObject.php 文件 // 取出连接池的时候被调用若返回false则当前对象被弃用回收public function beforeUse(): ?bool {// TODO: Implement beforeUse() method.return $this-ping();}public function ping():?bool {try {$a $this-rawQuery(SELECT 1);return true;} catch (\Throwable $e){return false;}}
在beforeUse方法中 加入一个数据库的连接测试 若连接正常 返回true,否者返回false
修改好后,重启easyswoole ,等待一段时间(默认8小时断线,你就第二天) 再去调用接口,就不会有获取数据库连接超时的异常报错了