Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

195
Vistas
Ejecutar imap_close no funciona

Tengo una página con clientes y con ajax estoy cargando información sobre si nos envían un correo electrónico o no.

El código se ve así:

 $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; $username = 'email'; $password = 'password'; $this->session->data['imap_inbox'] = $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); foreach($customers as $customer){ $emails = imap_search($inbox, 'FROM ' . $email); // Processing info }

Pero hay aproximadamente 20-30 clientes en una página, por lo que el proceso a veces tarda entre 10 y 20 segundos en mostrarse y no pude optimizar el proceso.

Pero cuando el cliente intenta volver a cargar una página, todavía está esperando antes de que finalice imap_search , por lo que al recargar podría tomar 20 segundos antes de que la página se vuelva a cargar.

He intentado abortar el ajax con la función beforeunload y cerrar el imap pero esto no funciona.

Mi código:

Ajax:

 $(window).bind('beforeunload',function(){ imap_email.abort(); // the ajax is succesfully aborted(as showed in console), yet the page still takes considerable time to reload $.ajax({ type: 'GET', url: 'getimapmails&kill=1', async:false }); // ajax call to the same function to call imap_close });

PHP:

 if($this->request->get['kill'] == '1'){ imap_close($this->session->data['imap_inbox']); unset($this->session->data['imap_inbox']); $kill == 1; exit; }

Pero a pesar de que se cancela el ajax y se llama a imap_close en la variable que mantiene imap_open , la página tarda entre 10 y 20 segundos en recargarse, por lo que asumo que el imap no se cerró.

¿Cómo cierro el imap para que la página pueda recargarse inmediatamente?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Recomendaría matarlo creando un archivo que provoque una interrupción:

 $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; $username = 'email'; $password = 'password'; $this->session->data['imap_inbox'] = $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); foreach($customers as $customer){ clearstatcache(); //Can't use the cached result. if(file_exists('/tmp/kill_imap.'.$this->session->id)) break; //making the assumption that /tmp and session->id are set, but the idea is a temporary folder and a unique identifier to that session. $emails = imap_search($inbox, 'FROM ' . $email); // Processing info } if(file_exists('/tmp/kill_imap.'.$this->session->id)) unlink('/tmp/kill_imap.'.$this->session->id);

Luego, al salir de ajax, simplemente llame a un script php que simplemente crea ese archivo. y romperá su bucle y eliminará el archivo.

over 4 years ago · Santiago Trujillo Denunciar

0

Si lo entendí correctamente, el código que consume mucho tiempo se encuentra dentro del ciclo foreach().

Ahora, incluso si realiza una segunda solicitud para eliminar la sesión IMAP, ese bucle foreach() continuará hasta que finalice o PHP lo elimine si (y cuando) el tiempo de ejecución excede su configuración max_execution_time.

En cualquier caso, necesita algo dentro de su ciclo foreach() que verifique en cada ronda si se ha cumplido una condición para abortar, para terminar rápidamente la solicitud actual y permitir que el cliente haga una nueva.

Le sugiero que mire la función de PHP connection_aborted() , que podría usar para detectar una vez que el cliente aborta la solicitud actual y, de manera más general, podría leer sobre el tema del manejo de la conexión para tener una mejor idea de cómo se manejan las conexiones y las solicitudes. en PHP.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda