entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

-1voto

programar eventos con fechas

hola chic@s en esta ocasion necesito apoyo para programar con fechas en practica deseo que se imprima un mensaje despues que pasen algunos minutos de la hora actual por ej en mi siguiente codigo con la funcion date obtengo la fecha con la hora y los minutos luego declaro una variable que asigno la misma fecha pero con una hora distinta para que cuando llege a tal hora se ejecuta mi sentencia.

$time = date("d/m/Y h i");  // ej 24.02.2017 15.40 
$punto = date("d/m/Y" 15.50); // despues de 10 minutos se debe imprimir el mensaje
if($time == $punto ) {echo "punto";}

nota: el codigo que muestro fue el primero que se me ocurrio lo he probado pero no es funcional

2votos

magarzon comentado

Se imprima un mensaje... ¿dónde? Web? Consola? Con qué propósito?

Por otra parte, ¿esperabas que la variable time se actualizara sola?

0voto

steven comentado

estimado quiero solo probar si es posible hacerlo el proposito todavia no lo tengo claro y la variable time no se que tiene ver si estoy tratando con date.
por este motivo al final de mi pregunta señalo que soy un dummie con las fechas cual seria tu ingenieria para llegar hacerlo

1 Respuesta

1voto

magarzon Puntos30650

No sé si esto es lo que buscas.

Para empezar, la función date en PHP solo te devuelve una fecha determinada con el formato que le hayas especificado. Lo que te devuelve es una cadena, así que si pones dos fechas distintas en $time y en $punto, no esperes que estas dos cadenas sean iguales en algún momento del tiempo, porque son cadenas, y no van a cambiar por sí solas.

Si lo que quieres es "pausar" tu script y que se despierte en una fecha determinada, por ejemplo 10 minutos más tarde, lo que tienes que hacer es esto:

time_sleep_until(time()+600);
echo 'Despierta, han pasado 10 minutos';

La función time_sleep_until admite un tiempo en Unix time, por eso obtenemos con time() el tiempo actual en Unix time y le sumamos 600 segundos (10 minutos).
Al cabo de 10 minutos se ejecutará el echo.
Pero tienes que tener en cuenta que tu script no va a hacer nada más en esos 10 minutos.

Si lo que quieres es que tu script haga otras cosas mientras está esperando a que pasen esos 10 minutos, ya te tienes que liarte con threads (que en PHP no es lo más fácil del mundo), multiprocesos o arquitecturas paralelas usando colas por ejemplo, dependiendo mucho de lo que quieras hacer (por eso te preguntaba qué querías hacer)

0voto

steven comentado

acabo de visitar la pagina oficial de php y he visto que tambien se puede usar la funcion sleep y varientas en alternativa al sleep until aunque no entiendo cual es la diferencia, no le encuentro ninguna aplicacion para los nanosegundos
respecto al tiempo creo que solo puede operar con las horas porque no hay ninguna referencia a las fechas, todo el tiempo esta especificado en segundos y para aclarar una fecha seria necesario hacer el calculo pero el resultado seria tan largo que provocaria un error.
respecto a lo que mencionas sobre el thread me parece interesante saber que tambien se pueden hacer esos tipos de operaciones pero al momento todavia no se me ocurre ninguna aplicacion para experimentar.
por ultimo te quiero omentar algunas dudas
cual es la diferencia entre print y print_r y como funciona la variabke var dump

0voto

magarzon comentado

La principal diferencia entre sleep y sleep until es que en el primero pones un tiempo en segundos, y en el segundo pones una fecha (en Unix Time, que al final también son segundos, pero es diferente)

No entiendo lo de las horas, las fechas y lo de que el resultado sería tan largo que daría un error.

print se usa para sacar una cadena por pantalla, es similar a echo, pero echo puede sacar más de una cadena.
print_r y var_dump para mostrar información sobre una variable, var_dump saca más información que print_r, pero el resultado de print_r lo puedes guardar en una variable, var_dump lo saca por defecto por la salida estándar (normalmente la pantalla o el navegador) y se puede llegar a guardarlo en una variable, pero no de forma sencilla.

0voto

steven comentado

el resultado puede ser largo porque si por ejemplo quiero programar un mensaje para un dia despues debera expresarlo en segundos porque la funcion no admite fechas por lo cual deberia dividir el tiempo en segundos si hoy es 25.02.17 deberia de hacer una serie de calculos que seria la asi
60 es 1 minuto 60x60 1h entonces 60x24 y el resultado seria una cifra de 6digitos
respecto a las variables que tipo de informacion puedo obtener

Retomando el tema anterior creo que se acaba de ocurrir una buena idea que consiste en examinar una pagina y extraer informacion que a su vez se filtrara en base a unos criterios. para conseguir buenos resultados el programa deberia de iniciarse todos los dias a una cierta hora por ejemplo desde los lunes hasta el viernes a las 5am luego terminar cuadno se haya conseguido una cierta cantidad de datos

0voto

magarzon comentado

Si quieres programar un mensaje para un día después, tener un proceso durmiendo no es la mejor solución, es lo que te decía, que dependiendo de lo que quisieras hacer, hay mil opciones. En ese caso, optaría por un proceso cron (si estoy trabajando con un servidor linux) o similar.

De todas formas, no te preocupes por los 6 dígitos, el tipo int de PHP puede aguantar eso y más (de hecho el tiempo Unix son 10 dígitos).

En cuanto a la información de las variables, con print_r básicamente obtienes la estructura y valores de los campos (si es un array o un objeto) con var_dump además puedes obtener el tipo de los campos.

De todas formas, de nuevo estás añadiendo pregunta sobre pregunta.

0voto

steven comentado

he visto que en mi servidor hay una opcion de permite establecer tareas quotidianas con un plugin cron, todavia no he podido hacer nada pero me parece una funcion interesante veniendo al caso cual seria el codigo con cron para programar un mensaje para el dia despues que cite en mi anterior comentario

0voto

magarzon comentado

Investiga un poco, y si no lo sacas por ti mismo, pregúntalo en otra pregunta.

0voto

steven comentado

si pero eso programa no corre en windows, acabo de investigar y todos apuntan a lo mismo cual seria entonces la manera de implementarlo en mi server xamp

0voto

magarzon comentado

Esfuérzate un poco al menos, con una simple búsqueda en Google he encontrado varios enlaces que te dicen cómo hacerlo.

0voto

steven comentado

si pero eso no es compatible con windows ni con el xamp solo se puede hacer desde un servidor o sistema linux los demas resultados llevan solo el titulo para atraer visitas

0voto

steven comentado

hay algunos incovenientes el primero que crontab es disponibile solo para sistemas linux y el otro que solo es accesible desde los hostings por lo cual no se puede hacer una prueba en local con mi servidor xamp.

0voto

carlossevi comentado

Si quieres desencadenar la ejecución de un script con criterios temporales lo más sencillo es utilizar las herramientas que trae cada sistema operativo.

El inconveniente de que en tu servidor de desarrollo tengas distinto entorno del servidor de producción es que nunca vas a poder probar un escenario 100% real. Tu puedes dejar tu tarea programada y testeada, pero en Windows tendrás que programarla con el Task Scheduler (o incluso lanzarla manualmente para validarla) y en Linux con Cron.

0voto

steven comentado

entonces si para emular una tarea programada en windows necesito utilizar una herramienta administrativa interna del sistema creo que no hace al caso mio porque no quiero que mi script funcione con dependencias porque en este caso si contrato un servidor que no disponga el crontab no podre hacer nada.
creo que la posible solucion es hacerlo con la funcion sleep y pasarle un tipo de dato mas largo del int para poder almacenar cifras mayores de seis digitos

1voto

carlossevi comentado

¿A qué te refieres con "emular"?

Dejar un hilo en ejecución continua hasta que llegue el momento oportuno es ineficiente, además de que cualquier instalación de PHP debería estar configurada para poner un límite y matar los scripts que se ejecutan durante demasiado tiempo.

Suponiendo que incluso pueda hacerse, ¿Quien ejecutaría ese supuesto hilo que va a estar en sleep? Igualmente lo tiene que ejecutar algún agente.

No intentes reinventar la rueda ni hacer sobreingeniería. Ese problema ya está solucionado mediante una línea del cron en Linux o una tarea programada en Windows. Es un elemento más que tendrás que configurar en tu instalación, pero no estamos hablando de dependencias porque es parte del sistema operativo.

Reduciendo al absurdo tu argumento, si no quieres depender de nada ya puedes ir empezando a desarrollar un sistema operativo ad hoc para tu aplicación.

0voto

steven comentado

con emular me refiero a la accion de ejecutar un script periodicamente como lo hace crontab de linux pero en windows con el task scheduler. esto supondria un procedmiento con los siguientes pasos

  1. iniciar el xamp a tal hora 2.correr el script .3 cerrar el xamp .4 volver a repetir el proceso el dia siguiente
    de otro modo se podria utilizar un script en bat o python para hacer lo mismo
    respecto al agente no lo habia tomado en cuenta creo que se resolveria configurando mi script para que se repetiera segun un patron establecido
    por ejemplo si quiero que todos los dias a las 5am visite una pagina y extraiga el titulo de la pagina seria cuestion de usar la funcion sleep y pasarle como parametro un tipo de dato mayor que int para que soporte todos los digitos luego cuando se cumpla, que espere otras 24 para volver a inciarlo.

por ultima cosa hay manera de saber si mi servidor soporta el crontab y cuales serian los posibles datos a tomar en cuenta antes de seguir
adicionalmente si mi servidor lo soporta puedo correr cualquier tipo de aplicacion indiferentemente del lenguaje php, python y js

1voto

carlossevi comentado

No tiene sentido que mantengas un script funcionando durante 24 horas para que esté 23 horas y 59 minutos "dormido". Además, si falla no volverá a ejecutarse mágicamente por si mismo.

Si quieres que una tarea suceda a las 5am, programa la tarea en el lenguaje que te dé la gana (VBScript, bat, Python, bash, PHP, Powershell...) y configura el programador de tareas del sistema para ejecutarla.

Si quieres que sea multiplataforma, dedícate a que el script funcione en todas las plataformas y no te preocupes por la nimiedad de que el programador de tareas del sistema va a ser distinto en ambas plataformas.

0voto

steven comentado

ok concuerdo contigo esto supone que seria una perdida en rendimiento pero que pasaria si lo configuro para que se inicie cada vez que sucede un evento es decir si por ej alguien visita la pagina se inicie y luego se reinicie a la proxima visita. de otra manera se podria mandar una orden remotamente para que se inicie el temporizador es decir si a la medianoche envio una orden a mi servidor para que empieze a contar las horas y cuando llege a las 5 empieze a correr el script y cuando termine que mate el proceso para no consumir recursos.
esto resolveria el problema de eficiencia que mencionas en las primeras lineas

2votos

carlossevi comentado

Se me ocurren muchísimas pegas al planteamiento que haces, pero es que además no tiene ninguna ventaja. El único motivo para hacerlo sería tu cabezonería. Hazlo como quieras, aquí solo te aconsejamos sobre cómo se hacen las cosas en el mundo real de los proyectos que funcionan.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta