Pregunta

Tengo un archivo "update.php", que hace algunas operaciones de MySQL. Una tarea cron ejecuta este archivo cada 5 minutos. Por desgracia, no puedo ejecutar el trabajo de cron con más frecuencia.

Así que tuve la idea de que yo podría añadir ...

<html>
<head>
  <meta http-equiv="refresh"  content="2; URL=<?php echo $_SERVER['SCRIPT_NAME']; ?>" />
</head>
<body></body>
</html>

... a la página "update.php". Cron se ejecute el archivo de una manera que va a la página se actualice automáticamente? O habrá que no ocurre porque no hay cliente con un navegador?

Si la meta de actualización no tiene ningún efecto, ¿hay alguna otra posibilidad para lograr la restauración de la página?

Gracias de antemano!

¿Fue útil?

Solución

Me temo que no va a funcionar, porque es una función de navegador para actualizar la página.

Pregunta: ¿Por qué no se puede establecer el trabajo de cron para ejecutar con mayor frecuencia que cada 5 minutos

Si no hay otra opción, entonces podría crear estás propio demonio para hacer el trabajo más frecuencia.

por ejemplo. Su script php podría:

  • Ejecutar
  • Espere 60 segundos
  • Ejecutar
  • (Espera; Ejecutar; dos veces más)
  • Salir

Por ejemplo: (Por variación de sshow código 's)

<?php

$secs = 60;

ignore_user_abort(true);
set_time_limit(0);

dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();

?>

Esta versión del guión seguirá siendo residente durante cuatro minutos, y ejecutar el código de 4 veces lo que sería equivalente a ejecutar cada minuto, si este script se ejecuta por cron cada 5 minutos.

No parece cierta confusión acerca de lo que es una tarea programada es, y cómo se ejecuta.

cron es un demonio, que se encuentra en el fondo, y las tareas de ejecución a través de la cáscara en un horario especificado en crontab s.

Cada usuario tiene un crontab, y hay un crontab sistema.

crontab Cada usuario puede especificar los trabajos que se ejecutan como ese usuario.

Por ejemplo:

# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every sunday"

Así que para que se ejecute cada cinco minutos:

*/5 * * * *     echo "This will be run every five minutes"

O para ejecutar cada minuto:

* * * * *       echo "This will be run every minute"

La salida de los comandos son enviados al propietario de la crontab (o según lo especificado por MAILTO). Esto significa que si se ejecuta algo cada minuto que se enviará por correo electrónico a cada minuto, a menos que se asegure de que toda la salida normal, se suprime o redirigido.

Los comandos se ejecutan como el usuario que posee el crontab, lo que contrasta con los scripts ejecutados por el servidor web, que se ejecutan como el usuario 'nadie' (o similares - cualquiera que sea el servidor web está configurado para ejecutarse como ). Esto puede hacer la vida más complicada si la tarea programada es la escritura a los archivos que se supone para ser visitada por los scripts ejecutados por el servidor web. Básicamente usted tiene que asegurarse de que los permisos siguen siendo correctos.

Ahora, no estoy seguro de que este es el sistema que se está refiriendo a. Si se refiere a algo más de cronjob, lo anteriormente expuesto no podría aplicarse.

Si usted quiere hacer algo que su anfitrión actual es no dejar que lo hace, entonces en lugar de cortar alrededor de la restricción, es posible que lo que debe buscar al cambiar de proveedor de hosting?


Una alternativa es poner el script en estás guiones localización normal, y tienen algunos corren programador externo wget contra ella en cualquier frecuencia que desee.


Otra alternativa es la actualización en-demanda de la forma de sugerencia VarTec 's. Como quiera que no resuelve sus problemas.

Otros consejos

Estoy bastante seguro de que puede lograr que al hacer esto:

<?php

$secs = 120;

ignore_user_abort(true);
set_time_limit(0);

while (true)
{
    // do something

    // Sleep for some time
    sleep($secs);
}

?>

Editar

Usted tendrá que ejecutar una vez después de cada reinicio del servidor a menos que hacerlo como Douglas describe.

Actualizar

Mantener la respuesta de Douglas Leeder en mente, y luego echar un vistazo a esto:

http://www.php.net/manual /en/function.ignore-user-abort.php

Yo diría que no trate de hacer esto con php, cambiar su crontab. Si necesita que su aplicación para hacer una tarea programada cada minuto y su alojamiento no proporciona esta opción, más probable es que ya no caben en su alojamiento. Conseguirse un VPS por 20 $ al mes (Slicehost, Servergrove).

Actualización:. Editted basada en la nueva información

Meta-actualización no funcionará porque cronjob.de va a utilizar un sistema automatizado que en realidad no leer el contenido de la página. No hay ningún navegador, así que nada que ver la meta de actualización.

Usted tiene un par de opciones. Varían en mayor o menor medida horribilidad.

La mejor opción es cambiar servicios de alojamiento web. Un buen servicio de hosting tendrá soporte completo para cron. Pero si es necesario tocar cron, honestamente, probablemente debería estar en un host VPS de todos modos. Una gran cantidad de los ejércitos se opondrá a una tarea de cron que ejecuta cada minuto menos que la tarea es simplemente actualizando algo realmente rápida y salidas. Pero anfitriones VPS por lo general no importa. Slicehost ofrece servidores para tan poco como $ 20 / mes. No se recomienda para las personas que nunca han tenido acceso a la raíz antes.

La única opción que tienes que trabajar con limitación de 5 minutos de cronjob.de es construir un bucle que se ejecutará una iteración, dormir, correr otra iteración, y repetir sin embargo muchas veces que necesita antes del final de la 5 minutos. Sin embargo, hay dos principales problemas con este enfoque. En primer lugar, si usted tiene una petición que dura 4 minutos, hay una clara posibilidad de que su servicio de hosting podría matar a la petición antes de que termine. En segundo lugar, si el servidor web no está configurado apenas a la derecha, una solicitud de este tipo podría bloquear otras solicitudes, evitando que los usuarios legítimos tengan acceso a su sitio - que podría poner en cola, y estar a la espera de la solicitud cronjob.de para terminar antes de poder completar sus solicitudes . Y puesto que la solicitud se llevará a 4-5 minutos para terminar, antes de ser repetida un minuto más tarde, puede ser que sólo será capaz de acceder a su sitio una vez cada 5 minutos. Supongo que esto no es deseable. Por desgracia, la única manera de saber si va a ir en contra de cualquiera de estos problemas es preguntar a su servicio de hosting. No recomiendo probarlo antes de pedir, porque no se puede apreciar que si se va inesperadamente mal y comienza a afectar a sus otros clientes en el servidor.

Si tiene suerte, incluso pueden estar dispuestos para configurar una tarea programada para usted.

Puede usar PHP para llamar al script ...

<?php
$script='/path/to/my/php/script.php';

ignore_user_abort(1);
set_time_limit(0);
$php=exec('which php');
while (1) {
    if (file_exists($script)) { exec($php.' '.$script); }
    else { file_get_contents($script); }
    sleep(2);
}
?>

El archivo que da $ script necesita para existir, de lo contrario, piensa que es una URL.

Se debe hacer el truco.

Lo que estamos tratando de hacer que implica la interacción del usuario, por lo que si no hay cliente entra en su "página"?

Por ejemplo, servlets y contenedores EJB pueden hacerlo mediante programación en el arranque contenedor de lo que necesita, así que supongo que para PHP la única manera de lograr "automáticamente" empleos cronlike es hacer algunos cambios en el código fuente de Apache, obviamente, sólo si está utilizando un servidor de alojamiento.

Una opción más praticable no contempling cambios en el código podría ser una secuencia de comandos cron llamando directamente a su página (wget, netcat, etc ...) puesto en marcha durante su arranque del servidor web

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top