2012-10-12 18 views
7

PHP MySQLi経由で非同期クエリを使用しようとしています。PHP MySQLiの非同期クエリ

次のコードは簡略化されていますが、元のコードはクラスの依存関係のためにここではあまりにも冗長です。また接続mysqli_handleへの参照が既に設定されていると仮定してください。

$query_1 = "SHOW TABLES FROM moxedo"; 
$query_2 = "CREATE TABLE `moxedo`.`mox_config_n85ad3` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT , `group_id` INT(3) UNSIGNED NOT NULL , `is_enabled` INT(1) UNSIGNED NOT NULL , `tag` VARCHAR(255) NOT NULL , `name` VARCHAR(80) NOT NULL , `value` VARCHAR(255) NOT NULL , `description` TEXT NOT NULL , `init_params` TEXT NOT NULL , `datetime_added` DATETIME NOT NULL , `datetime_lastmodified` DATETIME NOT NULL , `timestamp_univ` BIGINT(14) NOT NULL , PRIMARY KEY (`id`)) ENGINE = INNODB 
"; 
$query_3 = "ALTER TABLE `moxedo`.`mox_config_n85ad3` ADD UNIQUE `ix_u_tag_oq` (`tag`)"; 
$query_4 = "SHOW TABLES FROM moxedo"; 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_1)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_2, MYSQLI_ASYNC)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_3, MYSQLI_ASYNC)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_4)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

クエリ1を呼び出すとOKが実行されます。クエリ2の呼び出しもOKになります。

しかし、クエリー3とクエリー4を実行しようとすると「コマンドが同期していないので、このコマンドを実行できません」というエラーが表示されます。私の研究オンラインでは、mysqli_free_result 2とクエリ3は結果セットを返しません。

このエラーが発生しないで複数の呼び出しを行うことができるように、非同期呼び出しを正しく終了するには、何が必要ですか?

答えて

15

古い質問ですが、私はこれまでに遭遇し、可能であれば手助けしたいと考えています。

残念ながら、mysqliのドキュメントは、特にこの点では欠けています。問題は、 '非同期'モードがクライアント側の動作であり、クライアント/サーバプロトコルの一部ではないということです。つまり、ある時点で1つのクエリ(または複数のクエリ)を接続上で実行することしかできません。 MYSQLI_ASYNCは、クエリ結果を待つ間にアプリケーションがブロックしないように指定します。結果は、後でmysqli_pollで収集する必要があります。

あなたの例では、$ query_1は同期式なので、返されて$ mysqli_stmt_objに代入されるまでに完全に完了します。 $ query_2は$ mysqli_handle上で非同期で開始され、結果を待たずに戻ります。スクリプトが$ query_3に到達するまでに、まだ$ query_2を待っている保留中の結果があります。したがって、最後のものを終了する前に別のクエリを送信しようとします。

+0

ありがとうKyle。とても有難い。私はこれを早く見つけたかどうかは分かりませんが、後で私のために便利になるでしょう。乾杯。 –

+0

ありがとう、@カイル。これはこのシナリオの非常に良い説明です。 –