para mac descargar conector php asynchronous mysqli mysqlnd

php - mac - mysql to windows



La mejor manera de llamar y "olvidarse" de una consulta asincrónica mysqlnd INSERT (2)

Es esto un duplicado?

Lo he verificado y no lo creo. Hay muchas preguntas sobre mysql asincrónico pero me interesa un problema en particular:

Preparar

Estoy trabajando con php y mysql en esta situación.

Digamos que tengo mi conexión mysqli así:

$link = new mysqli(''localhost'', ''root'', ''password'', ''A_Database'');

He instalado mysqlnd para realizar consultas mysql asincrónicas usando el parámetro ''MYSQL_ASYNC'':

$link->query("INSERT INTO `A_Table` VALUES(''stuff!'')", MYSQLI_ASYNC);

Gol

Solo quiero insertar un registro, y no necesito recuperarlo hasta el futuro lejano, así que no estoy preocupado por cuánto tiempo tardará en completarse la consulta asíncrona, y no necesito realizar una evaluación final. acción cuando sé que la consulta está completa. Necesito realizar otras consultas mysql no relacionadas una vez que haya pasado la sección del código donde ocurren las consultas de inserción.

Problema

Realizar una consulta como esta bloqueará otras consultas más adelante en la secuencia de comandos con errores fuera de sincronización. Para poder lidiar con eso, tuve que agregar algo como el siguiente código después de cada consulta asíncrona:

$links = $errors = $reject = array($link); if ($link->poll($links, $errors, $reject, 1)) { foreach ($links as $resultLink) { if ($result = $resultLink->reap_async_query()) { if (is_object($result)) { $result->free(); } } } }

Esto efectivamente detiene los errores de desincronización y mi código funciona bien.
Sin embargo, dos cosas todavía me preocupan:

1) No quiero tener que molestarme con esto, porque solo realizo consultas de inserción y no me importa tener alguna respuesta en mi código cuando sé que las inserciones están completas.

2) El código de sondeo se ejecuta muy lentamente en mi servidor; mucho más lento que realizar una consulta regular y obtener de forma sincrónica los resultados.

Resumen

Quiero ejecutar la consulta de inserción con dos requisitos; la consulta no es de bloqueo (asíncrona) y aún puedo realizar otras consultas de mysql más adelante. Solo quiero insertar-consultar y ''olvidarme'', y seguir con mi código.

¿Alguna sugerencia sobre cuál es la mejor manera de hacer esto?


Si desea poder activar y olvidar sus consultas, su enfoque actual es en su mayoría correcto, aunque sugeriría que la lentitud que experimenta es posiblemente porque tiene ''1'' configurado como el parámetro ''segundos'' en $link->poll($links, $errors, $reject, 1) . Esto significa que la encuesta esperará hasta 1 segundo para que vuelva la consulta. Si configura esto en ''0'', no esperará, regresará mucho más rápido con una respuesta de si la consulta está completa.

En segundo lugar, si no necesita la respuesta de esta consulta, puede hacer otras cosas mientras se está ejecutando esta consulta, no tiene que sentarse allí esperando que vuelva en un bucle de sondeo asincrónico si tiene otras cosas para seguir adelante Esto es para lo que se diseñaron las consultas ASYNC. Le sugiero que agregue cheques a su método de ejecución de consultas para verificar si ya se está ejecutando una consulta sobresaliente de ASYNC, por lo que cada vez que necesite iniciar una nueva consulta, solo sondeará el servidor y esperará a que finalice cualquier consulta previa y estar disponible

Alternativamente, si desea ejecutar varias consultas que no tienen ningún impacto o dependencia entre sí, no hay nada que le impida configurar múltiples conexiones de bases de datos y ejecutar consultas ASYNC en todas ellas en paralelo, o configurar nuevas conexiones y ejecutar consultas cuando lo necesite.

Si desea externalizar por completo su SQL a otro proceso (sin cron), una forma sería configurar un script de supervisión persistente, utilizando Supervisor / Gearman, por ejemplo, para que pueda enviar consultas y procesar las consultas en un proceso. (o incluso servidor) diferente del local. Esto tiene la ventaja de que la secuencia de comandos remota se ejecuta como una aplicación CLI, por lo que tiene más capacidad para usar las horquillas y el procesamiento de subprocesos múltiples , y puede operar en un entorno menos expuesto.

Otro enfoque (opcionalmente usando cron) es usar una tabla de base de datos local optimizada para escritura (quizás en memoria), ejecutar sus insertos rápidamente en esa tabla, luego tener otro proceso que lea esta tabla de forma intermitente (o tener configuración de desencadenadores para ver nuevos entradas), y haga que ese proceso tome las nuevas filas insertadas de esa tabla y las mueva a la tabla principal más lenta.


Si su objetivo es insertar un registro y continuar ejecutando el código sin preocuparse por el resultado, puede utilizar la sintaxis INSERT DELAYED sin la necesidad del indicador ASYNC:

$link->query("INSERT DELAYED INTO `A_Table` VALUES(''stuff!'')" );

Vuelve de inmediato y puede continuar ejecutando nuevas consultas en la misma conexión. Usamos esto en nuestro sistema de registros.