日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

swoole原生mysql进程池_swoole的mysql连接池怎么弄

發布時間:2024/9/30 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swoole原生mysql进程池_swoole的mysql连接池怎么弄 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

swoole的mysql連接池怎么弄

發布時間:2020-12-28 09:54:07

來源:億速云

閱讀:68

作者:小新

這篇文章給大家分享的是有關swoole的mysql連接池怎么弄的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

傳統的nginx+FPM模式的PHP程序而言,每次請求FPM的worker都會連接一次mysql,然后請求結束便會斷開連接。對于并發小的應用來說這不會有什么問題,但是對于高并發的應用來說,頻繁建立連接Connect和銷毀連接Close,數據庫便會成為瓶頸,相信不少人也遇到過to many connection的mysql報錯吧。

連接池的優勢

連接池采用的是長連接模式,會一直保持與MySQL的連接,用完后會重新放回連接池,從而節省了建立連接和斷開連接的消耗,大大降低了系統IO的消耗,一定程度上提高了程序的并發性能。如果連接池空閑,就從連接池分配一個連接,否則,請求將被加入到等待隊列中。

實現

我們采用swoole實現mysql連接池連接池類<?php

require_once?"MysqlDB.php";class?MysqlPool{

private?static?$instance;

private?$pool;

private?$config;

private?$pool_get_timeout;

/**

*?獲取mysql進程池單例

*?@param?null?$config

*?@return?MysqlPool

*/

public?static?function?getInstance($config?=?null)

{

if?(empty(self::$instance))?{

if?(empty($config))?{

throw?new?RuntimeException("mysql?config?is?empty");

}

self::$instance?=?new?static($config);

}

return?self::$instance;

}

public?function?__construct($config)

{

if?(empty($this->pool))?{

$this->config?=?$config;

$this->pool?=?new?\Swoole\Coroutine\Channel($config['pool_size']);

for?($i?=?0;?$i?

\go(function()?use?($config)?{

$mysql?=?new?MysqlDB();

$res?=?$mysql->connect($config['mysql']);

if?($res?===?false)?{

throw?new?RuntimeException("Failed?to?connect?mysql?server");

}?else?{

$this->pool->push($mysql);

}

});

}

}

}

public?function?get()

{

if?($this->pool->length()?>?0)?{

$mysql?=?$this->pool->pop($this->config['pool_get_timeout']);

if?(false?===?$mysql)?{

throw?new?RuntimeException("Pop?mysql?timeout");

}

return?$mysql;

}?else?{

throw?new?RuntimeException("Pool?length?<=?0");

}

}

public?function?recycle(MysqlDB?$mysql){

$this->pool->push($mysql);

}

/**

*?獲取連接池長度

*?@return?mixed

*/

public?function?getPoolSize(){

return?$this->pool->length();

}}數據庫DB類<?phpclass ?MysqlDB{

private?$connection;

public?function?connect($config)

{

$connection?=?new?\Swoole\Coroutine\MySQL();

$res?=?$connection->connect($config);

if?($res?===?false)?{

throw?new?RuntimeException($connection->connect_error,?$connection->errno);

}?else?{

$this->connection?=?$connection;

}

return?$res;

}

public?function?query($sql){

$result?=?$this->connection->query($sql);

return?$result;

}}在HTTP協程服務器中創建連接池<?php

require_once?"MysqlPool.php";\Co\run(function?()?{

$server?=?new?\Co\Http\Server("0.0.0.0",?9501,?false);

$pool?=?MysqlPool::getInstance([

'pool_size'=>5,

'pool_get_timeout'=>1,

'timeout'=>1,

'charset'=>'utf8',

'strict_type'=>false,

'fetch_mode'=>true,

'mysql'=>[

'host'=>'127.0.0.1',

'port'=>'3306',

'user'=>'homestead',

'password'=>'secret',

'database'=>'blog',

]

]);

$server->handle('/',?function?($request,?$response)?use?($pool){

$mysql?=?$pool->get();

$res?=?$mysql->query("select?id,phone,username?from?user?limit?1");

var_dump($res);

$pool->recycle($mysql);

$response->end("

Test

");

});

$server->handle('/test',?function?($request,?$response)?{

$response->end("

Test

");

});

$server->handle('/stop',?function?($request,?$response)?use?($server)?{

$response->end("

Stop

");

$server->shutdown();

});

$server->start();});源碼地址 swoole-mysql-pool

感謝各位的閱讀!關于“swoole的mysql連接池怎么弄”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

總結

以上是生活随笔為你收集整理的swoole原生mysql进程池_swoole的mysql连接池怎么弄的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。