PHP异步mysql-query

Clo*_*lox 11 php mysql asynchronous

我的应用程序首先查询2个大型数据集,然后对第一组数据执行一些操作,并在第二组数据上"使用"它.

如果可能的话,我希望它只是同步查询第一组而第二组异步查询,在第一组上完成工作,然后等待第二组的查询完成,如果还没有,最后使用第一组关于它的数据集.

这有可能吗?

Tho*_*ten 17

这是可能的.

$mysqli->query($long_running_sql, MYSQLI_ASYNC);

echo 'run other stuff';

$result = $mysqli->reap_async_query(); //gives result (and blocks script if query is not done)
$resultArray = $result->fetch_assoc();
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想进行阻止呼叫,则可以使用mysqli_poll

http://php.net/manual/en/mysqli.poll.php

  • @Clox简短而直接的答案是PDO不支持非阻塞的异步查询,如http://php.net/manual/ru/mysqlinfo.api.choosing.php所示. (5认同)
  • @Clox我建议你在你的问题或标题中包含PDO,如果这是一个要求. (4认同)

Tom*_*ers 12

MySQL要求在一个连接中,在下一个查询启动之前完全处理查询.这包括获取所有结果.

但是,它有可能:

  • 逐个获取结果而不是一次获取所有结果
  • 通过创建多个连接来启动多个查询

默认情况下,PHP将等待所有结果都可用,然后在内部(在mysql驱动程序中)立即获取所有结果.即使使用例如一次一行地在代码中导入它们也是如此PDOStatement::fetch().使用PDO时,可以通过将属性设置\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY为来防止这种情况false.这对以下内容很有用:

请注意,速度通常受到存储系统的限制,该存储系统的特性意味着两个查询的总处理时间在运行它们的同时比逐个运行时要大.

一个例子(可以完全在MySQL中完成,但用于显示概念......):

$dbConnectionOne = new \PDO('mysql:hostname=localhost;dbname=test', 'user', 'pass');
$dbConnectionOne->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

$dbConnectionTwo = new \PDO('mysql:hostname=localhost;dbname=test', 'user', 'pass');
$dbConnectionTwo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$dbConnectionTwo->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$synchStmt = $dbConnectionOne->prepare('SELECT id, name, factor FROM measurementConfiguration');
$synchStmt->execute();

$asynchStmt = $dbConnectionTwo->prepare('SELECT measurementConfiguration_id, timestamp, value FROM hugeMeasurementsTable');
$asynchStmt->execute();

$measurementConfiguration = array();
foreach ($synchStmt->fetchAll() as $synchStmtRow) {
    $measurementConfiguration[$synchStmtRow['id']] = array(
        'name' => $synchStmtRow['name'],
        'factor' => $synchStmtRow['factor']
    );
}

while (($asynchStmtRow = $asynchStmt->fetch()) !== false) {
    $currentMeasurementConfiguration = $measurementConfiguration[$asynchStmtRow['measurementConfiguration_id']];
    echo 'Measurement of sensor ' . $currentMeasurementConfiguration['name'] . ' at ' . $asynchStmtRow['timestamp'] . ' was ' . ($asynchStmtRow['value'] * $currentMeasurementConfiguration['factor']) . PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

  • 考虑到PDO实际上不支持本机异步操作,我认为这个答案很混乱.你应该使用MYSQLI. (3认同)