PHP controla el tiempo de la operación del bucle

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!

Supongo que te gusta

Origin blog.csdn.net/zy17822307856/article/details/112798293
Recomendado
Clasificación