php异步查询数据库,PHP 中 MySQL 数据库异步查询实现

$host       = '127.0.0.1';

$user       = 'root';

$password   = '';

$database   = 'test';

/**

* 期望得到额结果

* array(

*  1 => int,

*  2 => int,

*  3 => int

* )

*/

$result = array(1=>0, 2=>0, 3=>0);

//异步方式[并发请求]

$time_start = microtime(true);

$links = array();

foreach ($result as $key=>$value) {

$obj = new mysqli($host, $user, $password, $database);

$links[spl_object_hash($obj)] = array('value'=>$key, 'link'=>$obj);

}

$done = 0;

$total = count($links);

foreach ($links as $value) {

$value['link']->query("SELECT COUNT(*) AS `total` FROM `demo` WHERE `value`={$value['value']}", MYSQLI_ASYNC);

}

do {

$tmp = array();

foreach ($links as $value) {

$tmp[] = $value['link'];

}

$read = $errors = $reject = $tmp;

$re = mysqli_poll($read, $errors, $reject, 1);

if (false === $re) {

die('mysqli_poll failed');

} elseif ($re < 1) {

continue;

}

foreach ($read as $link) {

$sql_result = $link->reap_async_query();

if (is_object($sql_result)) {

$sql_result_array = $sql_result->fetch_array(MYSQLI_ASSOC);//只有一行

$sql_result->free();

$hash = spl_object_hash($link);

$key_in_result = $links[$hash]['value'];

$result[$key_in_result] = $sql_result_array['total'];

} else {

echo $link->error, "\n";

}

$done++;

}

foreach ($errors as $link) {

echo $link->error, "1\n";

$done++;

}

foreach ($reject as $link) {

printf("server is busy, client was rejected.\n", $link->connect_error, $link->error);

//这个地方别再$done++了。

}

} while ($done

var_dump($result);

echo "ASYNC_QUERY_TIME:", microtime(true)-$time_start, "\n";

$link = end($links);

$link = $link['link'];

echo "\n";

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP 实现异步写入数据库可以使用以下两种方法: 1. 使用 Swoole 扩展 Swoole 是一个高性能的异步网络通信框架,可以用来实现异步写入数据库。以下是一个简单的示例代码: ```php $server = new swoole_server("127.0.0.1", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $server->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, "hello\n"); $serv->after(1000, function () use ($fd) { $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'password'); $dbh->exec("INSERT INTO `test` (`name`) VALUES ('test')"); $dbh = null; $serv->send($fd, "world\n"); }); }); $server->start(); ``` 2. 使用 MySQLi 的异步 API MySQLi 是 PHP 的一个扩展库,它提供了异步 API,可以用来实现异步写入数据库。以下是一个简单的示例代码: ```php $mysqli = new mysqli("127.0.0.1", "root", "password", "test", 3306, null, MYSQLI_ASYNC); $mysqli->query("INSERT INTO `test` (`name`) VALUES ('test')", MYSQLI_ASYNC); $links = [$mysqli]; $wait_for = null; $wait_timeout_sec = 1; $wait_timeout_usec = 0; do { $result = mysqli_poll($links, $wait_for, $wait_timeout_sec, $wait_timeout_usec); if ($result === false) { echo "Error: " . mysqli_error($mysqli); break; } elseif ($result > 0) { $result = $mysqli->reap_async_query(); var_dump($result); break; } } while (true); ``` 需要注意的是,使用 MySQLi 异步 API 需要开启 MySQLi 的异步模式,而且只有在 PHP 编译时开启了 mysqli 模块的异步支持才能使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值