发布于 2015-08-09 09:43:59 | 238 次阅读 | 评论: 0 | 来源: 网络整理
用于获取MySQLi的socket文件描述符。可将mysql的socket增加到swoole中,执行异步MySQL查询。
int swoole_get_mysqli_sock(mysqli $db)
swoole_get_mysqli_sock依赖PHP的 mysqlnd
和 mysqli
2个扩展,请使用php -m
或phpinfo
确认PHP是否有这2个扩展。
如果想要使用异步MySQL,需要在编译swoole时制定--enable-async-mysql
swoole_get_mysqli_sock仅支持mysqlnd驱动,php5.4以下版本不支持此特性
示例:
$db = new mysqli;
$db->connect('127.0.0.1', 'root', 'root', 'test');
$db->query("show tables", MYSQLI_ASYNC);
swoole_event_add(swoole_get_mysqli_sock($db), function($db_sock) {
global $db;
$res = $db->reap_async_query();
var_dump($res->fetch_all(MYSQLI_ASSOC));
swoole_event_exit();
});
建议自行编译PHP,而不是使用apt-get或yum安装,避免因为缺少头文件导致编译不通过。编译PHP时要加入--enable-mysqlnd --with-mysqli
一个MySQL连接只能执行1条SQL语句,下面的代码是错误的。
$db->query("select * from test", MYSQLI_ASYNC);
$db->query("select * from test", MYSQLI_ASYNC);
在第一条SQL执行后,未调用reap_async_query返回结果前,不能再次执行$db->query()。如果想要并发执行SQL需要创建2个以上MySQL连接,并分别调用swoole_get_mysqli_sock和swoole_event_add,加入到事件循环中。可以参考 https://github.com/swoole/swoole-src/blob/master/examples/mysql_proxy_server.php。
这是错误的理解,即使是异步MySQL也需要一个连接池。正如上一条信息所示,并发SQL必须有多个连接。