Ejecutar un programa en un ciclo, pero durante el proceso de ejecución del ciclo, puede expirar y hacer que el programa muera, por lo que es necesario limitar el tiempo máximo de cada operación del ciclo. Si se agota, desconectará directamente el proceso de mejora y continuará con el siguiente nivel de operación del circuito. Ctrip, multi-threading puede completar la operación, pero cuando no comprenda estas tecnologías avanzadas, puede usar este método simple en su lugar.
TaskAsync.php
espacio de nombres TaskAsync; use Workerman \ MySQL \ Connection; class TaskAsync { / ** * Tarea asincrónica * @params $ func La función principal que se ejecutará de forma asincrónica * @params $ func La función que se ejecutará de forma asincrónica después del tiempo de espera * @params $ maxTime Asynchronous tiempo de espera de ejecución Unidad de tiempo: segundos s * @params $ params Los parámetros que se pasarán a $ func * / función estática pública asyncTask (invocable $ func, $ params = array (), $ maxTime = 0, invocable $ func2 = null, $ params2 = array ()) { pcntl_signal (SIGCHLD, SIG_IGN); // Instalar la señal de monitoreo $ pid = pcntl_fork (); // Generar un hilo if ($ pid == -1) { exit (); // Error al crear proceso hijo } else if ($ pid == 0) { // Prueba lógica { // Ejecutar función de usuario call_user_func_array ($ func, $ params); } finalmente { // Finaliza el proceso después de la ejecución posix_kill (posix_getpid (), SIGKILL); exit (0); // Finaliza la operación del proceso hijo } } else if ($ pid> 0) { $ t = time (); while (verdadero) { $ nPid = pcntl_wait ($ s, WNOHANG); if ($ nPid> 0) { break; } else if ($ nPid <0) { break; } else if ($ maxTime && time () - $ t> $ maxTime) { // El tiempo de espera predeterminado es 0, es decir, el tiempo de espera no está limitado posix_kill ($ pid, SIGKILL); si (! empty ($ func2)) { call_user_func_array ($ func2, $ params2); } romper; } else { dormir (1); // 每秒 轮询 检查 } } } } función estática pública getMysqlConn () { $ dbConfig = require (APP_PATH. '/database.php'); devolver nueva conexión ($ dbConfig ['nombre de host'], $ dbConfig ['puerto de host'], $ dbConfig ['nombre de usuario'], $ dbConfig ['contraseña'], $ dbConfig ['base de datos']); }} 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
index.php
use TaskAsync \ TaskAsync; // Use while (true) { $ db = TaskAsync :: getMysqlConn (); // Operación de base de datos $ db-> closeConnection (); $ data = []; // Datos entrantes TaskAsync :: asyncTask ( array (new Download (), 'downLoadExcel'), array ($ data), 60 * 60 * 10, function ($ data) { echo'execution timeout '; }, array ($ data) );} 12345678910111213141516
Antes de pcntl_fork, no puede haber ninguna operación de conexión a la base de datos. Por lo tanto, si la operación de la base de datos está involucrada, debe volver a conectarse a la base de datos cada vez que realice un bucle. Después de realizar la operación, recuerde desconectar la conexión de la base de datos, de lo contrario, aparecerá el mensaje MySQL el servidor se ha ido!