Foros del Web » Programando para Internet » PHP »

retardo en un bucle

Estas en el tema de retardo en un bucle en el foro de PHP en Foros del Web. como puedo hacer un retardo en un bucle de php? Tengo un while para recorrer los registros devueltos por una base de datos. Lo que ...
  #1 (permalink)  
Antiguo 15/02/2006, 09:59
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 18 años, 11 meses
Puntos: 2
retardo en un bucle

como puedo hacer un retardo en un bucle de php?

Tengo un while para recorrer los registros devueltos por una base de datos. Lo que me gustaria es que tardara un cierto tiempo definible por cada vuelta del bucle.

Es posible?
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #2 (permalink)  
Antiguo 15/02/2006, 10:44
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
con SLEEP y control del buffer.

Qué onda, ese efecto es posible con la función SLEEP, que duerme a tu script por la cantidad de segundos que le quieras poner.

El problema es que no aparecerá nada en pantalla del navegador, ya que todo el contenido de salida es almacenado en un buffer previo y tienes que poner instrucciones adicionales para liberar ese buffer, que en este caso son las instrucciones ob_flush() y flush() y aquí puedes ver comentarios de por qué tienen que ir ambas.

Por ejemplo, el siguiente código mostrará una línea cada segundo en la pantalla del navegador.

Código PHP:
<?php
$i
=0;
while (
$i<10) {
  echo 
"Soy el $i de la lista.<br/>";
  
ob_flush();flush();sleep(1);
  
$i++;
  }
?>
Un saludo, man.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #3 (permalink)  
Antiguo 15/02/2006, 10:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Puedes usar:

sleep()
www.php.net/sleep

Pero .. OJO, por qué la filosofía de ejcución de un script PHP no es la de "retardar" pues en principio la ejecución se lanza ... PHP lo ejecuta y cuando termina .. el resultado (su "salida") es enviada al "cliente". Por ende . un "retardo" en la ejecución no te servirá para determinados procesos (deberías concretar con que fín vas a usar dicho retardo).

Otro problema que tendras es sobre el tiempo que PHP dá máximo para ejecutar un script. Si tu tienes un bucle con X iteracciones y un retardo por "pasada" del bucle de N . .multiplica y suma el proceso normal del própio scirpt para determinar cuanto tiempo necesita ese script para ejecutarse. Si superas el tiempo máximo que PHP dá por defecto (30 segundos) .. tendrás que aumentar dicho tiempo con la función:

set_time_limit()
www.php.net/set_time_limit

Un saludo,
  #4 (permalink)  
Antiguo 16/02/2006, 02:24
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 18 años, 11 meses
Puntos: 2
Voy a concretar. Es un bucle que recorre una tabla con direcciones de correo electronico, y en cada interaccion mando un correo a la direccion correspondiente.
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #5 (permalink)  
Antiguo 16/02/2006, 06:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Por mi parte prefiero entregar todo al MTA para que este los ponga en cola y los envie cuando pueda .. así libero a PHP de ese proceso.

Si pese a eso o limitaciones de tu MTA te indica que no puedes enviar tantos e-mails por tiempo dado .. Ok, usa sleep() y ten presente las limitaciones de PHP sobre el tiempo máximo de ejecución de los scripts .. lo cual deberas aumentar.

Un saludo,
  #6 (permalink)  
Antiguo 16/02/2006, 07:23
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 18 años, 11 meses
Puntos: 2
Ok, gracias cluster. Por favor, podiras explicarme un poco mas como harias para entregar todo al MTA?
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #7 (permalink)  
Antiguo 16/02/2006, 08:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por oskarL
Ok, gracias cluster. Por favor, podiras explicarme un poco mas como harias para entregar todo al MTA?
Me refería a enviar tu e-mail con tu bucle tal cual lo haces.

Es el MTA el que va poniendo en cola los e-mails que van llegando para enviarlos.

Otra posibilidad sería componer un enorme "TO" (para) (o BCC ... o CC simplemente) Pero eso mismo muchos proveedores consideran a esos e-mails con muchos destinatarios como "SPAM" .. Mejor enviarlos uno por uno como e-mails independientes. Lo más que podría bloquearte un "MTA" (servidor SMTP o lo que uses) sería por N peticiones máximas de tal cliente (IP .. en tu caso el servidor que corre PHP) por cierto tiempo. Si el "MTA" está instalado en el mismo servidor que ejecuta PHP .. normalemnte no hay limites de ese estilo para conexiones "locales" pero .. esto depende de la configuración de cada servidor de correo (MTA).

Un saludo,
  #8 (permalink)  
Antiguo 16/02/2006, 11:49
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
más ideas

¿Tienes servidor en Linux? ¿Con CPanel y esas monerías?

Si es así, entonces podrías hacer un script que cada vez que se ejecute envíe sólo 100 emails. Es como si tuviera memoria. La forma más fácil de hacerlo, que quizá no sería la óptima*, sería agregando una columna adicional a tu tabla de correos electrónicos y al momento de tomar el email, también marcas ese campo.

Ahora, suponiendo que ya hiciste eso, pues nada más haces un select de los correos que no tienen el campo marcado.

Y viene la mejor parte, ¿cómo hacer que tu script automatizado envíe n emails cada t tiempo? Digamos 100 emails cada hora.



Posibles Soluciones:
  • USANDO CRON JOBS. Cron Jobs es una forma de ejecutar comandos (o scripts) en el momento que tú lo programes. Digamos que tú quieres que tu script se ejecute todos los días a las 3 de la madrugada o quieres que se ejecute cada 45 minutos, con Cron Jobs no hay problema (busca más info sobre Cron Jobs en el foro).
  • CON OTRO SCRIPT QUE ADMINISTRE. Otra solución que se me ocurre es la siguiente. Hacer un script que se ejecute cada vez que alguien visita tu website. Como se ejecuta cada vez (podría ser cada minuto, cada 26 minutos, cada hora, etc.) éste tiene que poder decidir, haciendo los cálculos de tiempo respectivos de tiempo, si lanzará tu script que envía 100 emails. Tienes que deducir si ya ha pasado una hora, en cuyo caso lo lanzas, si no ha pasado una hora, entonces no lo haces.
Obviamente este segundo método mejorará en precisión entre mayor sea el número de visitantes de tu web. Lo menciono porque no todos tienen/pueden hacer uso de CronJobs.



*Óptima. Una forma de hacer más práctico tu sistema de envíos de emails, podría ser agregar una nueva tabla llamada ENVÍOS, integrada por las columnas: envío_id, fecha, asunto, email_id (FK), de esa forma y al hacer tu sistema más automatizado, podrías usarlo sin tener que diseñar un nuevo sistema cada vez que quieras enviar un boletín masivo.

Asímismo, en tu tabla de emails agregar una columna llamada no_quiere_mas y la marcas cuando en tus emails alguien haga click en "Si ya no quieres recibir este tipo de mensajes, haz click aquí.", de esa forma evitas que te reporten como SPAM directamente con el provedor de servicio de correo electrónico.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #9 (permalink)  
Antiguo 17/02/2006, 02:25
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 18 años, 11 meses
Puntos: 2
problema real enviando mails

Sere mas conciso con el problema que tengo.

Utilizo la clase phpmailer para enviar los correos tal y como he dicho: Una tabla con un monton de direcciones (de momento mas de 2000), y envio un boletin a todos ellos con un bucle que recorre la tabla.

El problema que tengo es que, esta todo enviandose correctamente, cuando de repente, al cabo de cierto numero de correos, deja de enviar, y devuelve el error "from_failed" (el metodo send() que es el que envia permite saber porque no se ha enviado).

El from es el mismo para todos, y es una cuenta de correo existente.

Intente utilizar el retardo por si el servidor no dejaba mandar tantos correos en tan poco tiempo, pero no se solucionó.

Gracias por tanta ayuda!!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 04:08.