2012-10-12 181 views
7

Estoy tratando de usar consultas asincrónicas a través de PHP MySQLi.Consultas asíncronas PHP MySQLi con

El siguiente código se ha simplificado, el código original es demasiado detallado para mostrar aquí debido a las dependencias de clase y todo eso. Además, supongamos que ya se ha configurado la referencia a la conexión 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); 
} 

La llamada a Query 1 pasa por OK. La llamada a Query 2 también pasa por OK.

Sin embargo, recibo errores de "Comandos no sincronizados; no se puede ejecutar este comando ahora" cuando intento ejecutar Query 3 y Query 4. De mi investigación en línea encontré información sobre el uso de mysqli_free_result pero consulta 2 y Consulta 3 no devuelven resultados.

¿Qué debo hacer para finalizar correctamente la llamada asincrónica para que pueda realizar varias llamadas sin obtener este error?

Respuesta

15

Una vieja pregunta, pero me encontré con esto antes y quiero ayudar si es posible.

Lamentablemente, la documentación de mysqli es bastante deficiente, especialmente en este sentido. El problema es que el modo 'async' es un comportamiento mysql del lado del cliente y no parte del protocolo cliente/servidor. Es decir, solo puede tener una consulta (o varias consultas, supongo) ejecutándose en una conexión en un momento dado. MYSQLI_ASYNC solo especifica que su aplicación no debe bloquearse mientras espera los resultados de la consulta. Los resultados deben recopilarse más tarde con mysqli_poll.

En su ejemplo, $ query_1 es sincrónico, por lo que está completamente listo para cuando vuelve y lo asigna a $ mysqli_stmt_obj. $ query_2 se inicia de manera asincrónica en $ mysqli_handle con éxito y regresa sin esperar los resultados. Cuando el script llega a $ query_3, todavía tiene un resultado pendiente esperando $ query_2. Por lo tanto, intenta enviar otra consulta antes de terminar la última, dándole 'comandos fuera de sincronización'.

+0

Gracias Kyle. Muy apreciado. No estoy seguro si descubrí esto antes, pero probablemente sea útil para mí [y para otros con suerte] más adelante. Aclamaciones. –

+0

Gracias, @Kyle. Esta es una muy buena explicación de este escenario. –