簡體   English   中英

PHP異步mysql-query

[英]PHP asynchronous mysql-query

我的應用程序首先查詢2個大型數據集,然后對第一組數據執行一些操作,並在第二組數據上“使用”它。

如果可能的話,我希望它只是同步查詢第一組而第二組是異步查詢,在第一組上完成工作,然后等待第二組的查詢完成,如果還沒有,最后使用第一組關於它的數據集。

這有可能嗎?

這是可能的。

$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();

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

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

MySQL要求在一個連接中, 在下一個查詢啟動之前完全處理查詢 包括獲取所有結果

但是,它有可能:

  • 逐個獲取結果而不是一次獲取所有結果
  • 通過創建多個連接來啟動多個查詢

默認情況下,PHP將等待所有結果都可用,然后在內部(在mysql驅動程序中)立即獲取所有結果。 這是真實的使用,例如,即使PDOStatement::fetch()來一次導入他們在你的代碼一行。 使用PDO時,可以通過將屬性\\PDO::MYSQL_ATTR_USE_BUFFERED_QUERYfalse來防止這種情況。 這對以下內容很有用:

請注意,速度通常受到存儲系統的限制,該存儲系統的特性意味着兩個查詢的總處理時間在運行它們的同時比逐個運行時要大。

一個例子(可以完全在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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM