TransWikia.com

¿Como optimizar proceso en php o ejecutarlo en segundo plano?

Stack Overflow en español Asked by Alberto Rojas on November 10, 2021

Tengo un archivo en php que se encarga de cerrar la sesión pero antes debe de cambiar el estatus en varias bases de datos diferentes, este proceso tarda un poco, por lo que el navegador se queda esperando y hasta que termina redirige a index.php
Este es el código para cerrar la sesión…

      <?php
      include 'HistorialController.php';
      include_once 'clases/Sistemas.php';
      session_start();

      $_SESSION['login'] = false;
      $_SESSION['recordar'] = 'no';         

      $liberar = new Sistemas('');
      $liberar->libera();

      unset($_SESSION['login']);
      header('Location: index.php');    
      ?>

El código de liberar es la siguiente…

       /**
       * Metodo que Libera las imagenes ocupadas por el usuario al salir de la session
       **/
       public function libera(){
           $id_user = $_SESSION['id_usuario'];
           $actualiza = "UPDATE Imagen SET estatuspm_web=0 WHERE id_usuariopm_web=" . $id_user." and estatuspm_web=1";
           for ($i = 0; $i < count($this->listaSistemas); $i++){ //RECORRIDO DE LOS SISTEMAS 
                $sistemaActual = $this->listaSistemas[$i];                 
                $baseConn = new BaseConexion("Sistema_".$sistemaActual); 
                if ($conn = $baseConn->conectar()) {
                     sqlsrv_query( $conn, $actualiza, $params);                      
                }
                $baseConn->close();
            }
       }

One Answer

Cuando se desloguea, guardar en una tabla cierres_de_sesion el id_usuario y tener un cronjob que tome una a una las filas de esta tabla y ejecute asincrona la lógica de liberacion. Según veo, la lista de sistemas es dependiente del usuario, así que funcionaría bastante bien.

Pros: Quitas este trabajo de cerrar sesiones del proceso de logout y lo dejas como una tarea externa, por lo que puedes redirijir a index.php de inmediato. Contras: Si tienes MUCHOS clientes cerrando sesion al mismo tiempo, tendrías que hacer alguna lógica de paralelización (y por ende sincronización) para que estos jobs corran eficientemente y no se te acumule mucho trabajo. Podrías usar una cola de trabajo o algo así, pero posiblemente complique mucho el sistema.

Answered by Pablo Alcantar on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP