2012-10-12 10 views
7

Ich versuche, asynchrone Abfragen über PHP MySQLi zu verwenden.PHP MySQL Asynchrone Abfragen mit

Der folgende Code wurde vereinfacht, das Original ist zu ausführlich, um hier wegen Klassenabhängigkeiten und all das aufzulisten. Bitte beachten Sie auch, dass der Verweis auf die Verbindung mysqli_handle bereits eingerichtet wurde.

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

Der Aufruf 1 zur Abfrage geht durch OK. Der Aufruf von Abfrage 2 wird ebenfalls durch OK ausgeführt.

Allerdings bekomme ich "Befehle nicht synchron; Sie können diesen Befehl jetzt nicht ausführen" Fehler, wenn ich versuche, Abfrage 3 und Abfrage 4 auszuführen. Aus meiner Online-Recherche habe ich einige Informationen zur Verwendung von mysqli_free_result aber Query gefunden 2 und Abfrage 3 geben kein Resultset zurück.

Was muss ich tun, um den asynchronen Anruf richtig abzuschließen, damit ich mehrere Anrufe tätigen kann, ohne diesen Fehler zu bekommen?

Antwort

15

Eine alte Frage, aber ich bin schon mal darauf gestoßen und möchte helfen, wenn es geht.

Leider fehlt die mysqli-Dokumentation besonders in dieser Hinsicht eher. Das Problem besteht darin, dass der asynchrone Modus ein mysql-Client-seitiges Verhalten ist und nicht Teil des Client/Server-Protokolls. Das heißt, Sie können immer nur eine Abfrage (oder mehrere Abfragen) zu einer bestimmten Zeit auf einer Verbindung ausführen. MYSQLI_ASYNC gibt nur an, dass Ihre Anwendung während des Wartens auf die Abfrage-Ergebnisse nicht blockieren sollte. Ergebnisse müssen später mit mysqli_poll gesammelt werden.

In Ihrem Beispiel ist $ query_1 synchron, also ist es vollständig fertig und kehrt zu $ ​​mysqli_stmt_obj zurück. $ query_2 wird asynchron auf $ mysqli_handle erfolgreich gestartet und kehrt zurück, ohne auf die Ergebnisse zu warten. Zu dem Zeitpunkt, zu dem das Skript zu $ ​​query_3 gelangt, wartet es immer noch auf ein ausstehendes Ergebnis, das auf $ query_2 wartet. Daher versucht es, eine weitere Abfrage zu senden, bevor die letzte beendet wird, und Ihnen "Befehle nicht mehr synchron" zu geben.

+0

Danke Kyle. Sehr geschätzt. Ich bin mir nicht sicher, ob ich das früher herausgefunden habe, aber es wird wahrscheinlich später für mich [und andere hoffentlich] nützlich sein. Prost. –

+0

Danke, @Kyle. Dies ist eine sehr gute Erklärung für dieses Szenario. –