封装了一个YAF框架下面的PHP异步查询Mysql的类,个人用这个类在分表或分布式库的应用下,非常方便,分享一下:/**
* 异步mysql查询
*
* @author KL_PENG
*/
class AsyncDB {
//查询集合信息
private $_R;
//进程集合对象
private $_L;
//异步进程数,默认3
private $_thr = 3;
//构造函数
public function __construct($sql, $threads = 0) {
//这里我把配置信息写在了YAF框架的配置文件里,按照自己的项目修改
$dbconfig = Yaf_Registry::get("config")->db;
$threads && $this->_thr = $threads;
if (is_array($sql) && count($sql) != $this->_thr) {
die('parameter sql is array but counts was not equal thread nums');
}
for ($i = 1; $i <= $this->_thr; $i++) {
$this->_R[$i] = "";
}
foreach ($this->_R as $k => $v) {
$obj = new mysqli($dbconfig->db_host, $dbconfig->db_user, $dbconfig->db_pass, $dbconfig->db_name, $dbconfig->db_port);
$this->_L[spl_object_hash($obj)] = array('value' => $k, 'link' => $obj);
}
$i = 0;
foreach ($this->_L as $value) {
$value['link']->query("set names utf8");
if (!is_array($sql)) {
$value['link']->query($sql, MYSQLI_ASYNC);
} else {
$value['link']->query($sql[$i], MYSQLI_ASYNC);
$i++;
}
}
}
//析构函数
public function __destruct() {
foreach ($this->_L as $value) {
$value['link']->close();
}
unset($this->_R);
unset($this->_L);
}
//禁止克隆
public function __clone() {
}
public function doAsync() {
$done = 0;
do {
$tmp = array();
foreach ($this->_L as $v) {
$tmp[] = $v['link'];
}
$read = $errors = $reject = $tmp;
$res = mysqli_poll($read, $errors, $reject, 1);
if ($res === false) {
die('mysqli_poll failed');
} else if ($res
continue;
}
foreach ($read as $link) {
$sql_result = $link->reap_async_query();
if (is_object($sql_result)) {
$sql_result_array = $sql_result->fetch_all(MYSQLI_ASSOC);
$sql_result->free();
$hash = spl_object_hash($link);
$key_in_result = $this->_L[$hash]['value'];
$this->_R[$key_in_result] = $sql_result_array;
} else {
//这里是我封装的日志操作类,按自己的项目修改
klog::put($link->error, 'mysql-async-error');
}
$done++;
}
foreach ($errors as $link) {
klog::put($link->error, 'mysql-async-error');
$done++;
}
foreach ($reject as $link) {
klog::put($link->connect_error . $link->error, 'mysql-async-error');
}
} while ($done _thr);
return $this->_R;
}
}
//调用示例:(从10张表中查找有没有name为klpeng的记录)
$sql = "select * from card_volume_";
for ($i = 1; $i <= 10; $i++) {
$sqls[] = $sql . $i ." where name='klpeng'";
}
$async = new AsyncDB($sqls, 10);
print_r($async->doAsync());
打赏
微信扫一扫,打赏作者吧~