mysqli_multi_query() 関数を使用して複数の非同期 INSERT クエリを実行する
PHP で非同期 INSERT クエリを実行し、処理を継続する
このチュートリアルでは、PHP の MySQLI 拡張機能と MariaDB サーバーを使用して、非同期 INSERT クエリを実行し、処理を継続する方法を説明します。
非同期 INSERT のメリット
従来の同期 INSERT クエリとは異なり、非同期 INSERT はデータベースとのやり取りを待たずに処理を継続できます。これは、パフォーマンスとスループットを向上させるのに役立ちます。
前提条件
このチュートリアルを完了するには、以下のものが必要です。
- PHP 7.2 以降
- MariaDB 10.2 以降
- Composer
手順
- Composer で必要なパッケージをインストールする
composer require ext-mysqli mariadb/mariadb-php
- データベース接続を確立する
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('Connection failed: ' . $mysqli->connect_error);
}
$sql = "INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')";
if ($stmt = $mysqli->prepare_async($sql)) {
$stmt->bind_param('ss', $name, $email);
$name = 'Jane Doe';
$email = '[email protected]';
$stmt->send();
// 処理を継続...
$stmt->close();
} else {
die('Error preparing statement: ' . $mysqli->error);
}
$stmt->close();
補足
mysqli_prepare_async()
関数は、非同期 INSERT クエリを準備するために使用されます。mysqli_stmt_bind_param()
関数は、クエリパラメータをバインドするために使用されます。mysqli_stmt_close()
関数は、ステートメントを閉じます。
例
上記のコードは、users
テーブルに 2 つの行を挿入します。
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')
INSERT INTO users (name, email) VALUES ('Jane Doe', '[email protected]')
PHP MYSQLI_ASYNC を使用した非同期 INSERT クエリの実装例
<?php
require __DIR__ . '/vendor/autoload.php';
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('Connection failed: ' . $mysqli->connect_error);
}
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
if ($stmt = $mysqli->prepare_async($sql)) {
$stmt->bind_param('ss', $name, $email);
// 1 行目のデータ
$name = 'John Doe';
$email = '[email protected]';
$stmt->send();
// 処理を継続...
// 2 行目のデータ
$name = 'Jane Doe';
$email = '[email protected]';
$stmt->send();
$stmt->close();
} else {
die('Error preparing statement: ' . $mysqli->error);
}
説明
- ライブラリの読み込み:
vendor/autoload.php
ファイルを読み込んで、Composer でインストールしたライブラリをすべて読み込みます。 - データベース接続:
mysqli
クラスを使用して、MySQL データベースへの接続を確立します。 - 非同期 INSERT クエリ準備:
mysqli_prepare_async()
関数を使用して、非同期 INSERT クエリを準備します。 - パラメータバインディング:
mysqli_stmt_bind_param()
関数を使用して、クエリパラメータ (name
とemail
) をバインドします。 - データ挿入: 2 つのループを使用して、
users
テーブルに 2 つの行を挿入します。- 各ループ内で、
$name
と$email
変数に挿入するデータを設定します。 mysqli_stmt_send()
関数を使用して、非同期 INSERT クエリを実行します。
- 各ループ内で、
- この例では、2 つの INSERT クエリを非同期に実行していますが、より多くのクエリを実行することもできます。
- エラー処理を追加して、エラーが発生した場合に適切な処理を行うようにする必要があります。
- トランザクションが必要な場合は、非同期 INSERT クエリを使用しないでください。
利点
- この方法は、従来の同期 INSERT クエリよりもパフォーマンスとスループットを向上させることができます。
- データベースとのやり取りを待たずに処理を継続できるため、アプリケーションの応答速度を向上させることができます。
注意点
- 非同期 INSERT クエリは、すべてのデータベースサーバーでサポートされているわけではありません。
- エラー処理とトランザクション処理に注意する必要があります。
PHP で非同期 INSERT クエリを実行するその他の方法
mysqli_multi_query()
関数は、複数のクエリを 1 回の送信で実行できます。この方法は、複数の INSERT クエリを実行する必要がある場合に役立ちます。
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('Connection failed: ' . $mysqli->connect_error);
}
$sql = "INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')";
$sql .= ";";
$sql .= "INSERT INTO users (name, email) VALUES ('Jane Doe', '[email protected]')";
if ($mysqli->multi_query($sql)) {
do {
if ($mysqli->more_results()) {
$result = $mysqli->store_result();
while ($row = $result->fetch_assoc()) {
// 結果を処理...
}
$result->close();
}
} while ($mysqli->next_result());
} else {
die('Error executing queries: ' . $mysqli->error);
}
非同期フレームワークを使用する
PHP には、非同期処理を簡素化するためのフレームワークがいくつかあります。これらのフレームワークは、非同期 INSERT クエリの実行を容易にする追加機能を提供します。
例:React PHP
<?php
require 'vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$mysqli = new \React\MySQL\Connection($loop, [
'host' => 'localhost',
'dbname' => 'database',
'user' => 'username',
'password' => 'password',
]);
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $name, $email);
// 1 行目のデータ
$name = 'John Doe';
$email = '[email protected]';
$stmt->executeAsync(function ($result) {
// エラー処理...
});
// 2 行目のデータ
$name = 'Jane Doe';
$email = '[email protected]';
$stmt->executeAsync(function ($result) {
// エラー処理...
});
$loop->run();
- 非同期フレームワークは、非同期処理を簡素化し、コードをより読みやすくすることができます。
- エラー処理、トランザクション処理、接続プーリングなどの機能を提供します。
- 非同期フレームワークを学習する必要があります。
PHP で非同期 INSERT クエリを実行するには、さまざまな方法があります。最適な方法は、ニーズと要件によって異なります。
- 単純な非同期 INSERT クエリの場合は、
mysqli_prepare_async()
関数を使用するのが最善です。 - 複数の INSERT クエリを実行する必要がある場合は、
mysqli_multi_query()
関数を使用するのが最善です。 - より複雑な非同期処理が必要な場合は、非同期フレームワークを使用するのが最善です。
php mysqli mariadb