php - job - cómo ejecutar el cron glpi
PHP: ejecutando trabajos programados(trabajos cron) (13)
Tengo un sitio en mi webhotel en el que me gustaría ejecutar algunas tareas programadas. ¿Qué métodos de lograr esto recomendaría?
Lo que he pensado hasta ahora es tener un guión incluido en la parte superior de cada página y luego dejar que este guión compruebe si es el momento de ejecutar este trabajo o no.
Este es solo un ejemplo rápido de lo que estaba pensando:
if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
runTask();
$timeToRunMaintainance = time() + $interval;
}
¿Hay algo más que deba tener en cuenta o hay un método mejor que esto?
¿Alguna vez has visto ATrigger ? La biblioteca de PHP también está disponible para comenzar a crear tareas programadas sin ningún gasto adicional.
Descargo de responsabilidad: estoy entre su equipo.
El método que está utilizando está bien, si no desea usar cronjobs o cualquier otro elemento externo, pero puede ser difícil comprobarlo cada vez que se carga una página.
Al principio, algunos cronjobs probablemente puedan ser reemplazados. Por ejemplo, si tiene un contador de cuántos usuarios se han registrado en su sitio web, simplemente puede actualizar este número cuando un usuario se registra, por lo que no tiene que usar un cronjob o ninguna tarea programada para esto.
Si desea utilizar tareas programadas, le sugiero que use el método que está utilizando en este momento, pero con una pequeña modificación. Si su sitio tiene suficientes visitas en un día, puede simplemente ejecutar las tareas (o ejecutar la función de verificación de tareas) solo para el 1% o tal vez el 0.01% de las visitas en lugar de todas ellas, el porcentaje que debe usar depende en los aciertos de página que tiene y cuántas veces desea ejecutar la tarea. Entonces, simplemente agregue un aleatorizador para lograr esta característica.
Simplemente podría usar una función como esta;
if(rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent.
// Run the tasks system
}
Espero que esto ayude,
Estoy respondiendo esto ahora porque nadie parece haber mencionado esta solución exacta.
En un sitio en el que estoy trabajando actualmente, hemos configurado un trabajo cron usando cPanel, pero en lugar de ejecutar el intérprete de PHP directamente (porque estamos usando CodeIgniter y nuestro código está asignado a una función de controlador, probablemente no sea así). es una gran idea) estamos usando wget
.
wget -q -O cron_job.log http://somehost/controller/method
-q
es para que wget no genere ningún resultado (por lo que no seguirás recibiendo correos electrónicos). -O cron_job.log
guardará los contenidos de lo que genere su controlador en un archivo de registro (sobrescrito cada vez para que no siga creciendo).
He encontrado que esta es la forma más fácil de hacer funcionar el cron ''apropiado''.
Externalizaría los cronjobs con www.guardiano.pm y llamaría a una url cada X minutos. Cuando se invoca su url (es decir, www.yoursite.com/dothis.php), usted ejecuta algún código. Si no desea que la web solicite la página cuando lo desee, puede permitir solo la solicitud en POST y enviar un parámetro que solo usted conoce con guardiano.pm
Eso es lo que haría porque lo hago en mis proyectos favoritos. ¡Que te diviertas!
La línea de comando PHP + cron sería lo que yo haría. Es simple y debe ajustarse a la factura. Por lo general, se instala con PHP por rutina.
Para eso están hechos los cronjobs. man crontab
suponiendo que está ejecutando un servidor de Linux. Si no tiene acceso al shell o no tiene forma de configurar cronjobs, hay servicios gratuitos que configuran cronjobs en servidores externos y hacen ping a una de sus URL.
Si desea evitar la configuración de trabajos cron y otras cosas (aunque sugeriría que es un método mejor), la solución que ha proporcionado es bastante buena. En varios proyectos, hice que el script PHP hiciera la comprobación para ver si era el momento de ejecutar la actualización.
El lado negativo (está bien, uno de los lados negativos) es que si nadie está usando la aplicación durante un cierto período, el script no se ejecutará.
La ventaja es que si nadie está usando la aplicación durante un cierto período, entonces la secuencia de comandos no se ejecutará. Las tareas que tengo configuradas para hacer son cosas como "actualizar un archivo de caché", "hacer una copia de seguridad diaria" y todo eso. Si alguien no está usando la aplicación, entonces no necesitará archivos de caché actualizados, ni habrá cambios en la base de datos para realizar una copia de seguridad.
La única modificación a su método que sugeriría es que solo ejecute esos controles cuando alguien inicie sesión con éxito. No necesita verificar cada carga de página.
Si no tiene la opción de configurar un cronjob, puede invocar el script con cUrl (como alternativa a wget, la misma funcionalidad). Simplemente haga una tarea programada en su máquina local que ejecute la función cUrl.
Si quieres algo más abstracto, podrías considerar usar algo así como un programador PHP. Por ejemplo:
Y también, para analizar la expresión de cron, puede usar una biblioteca existente como https://github.com/mtdowling/cron-expression . Proporciona muchos métodos útiles para ayudarlo a descubrir la información de un trabajo cron.
Espero que ayude.
Si se está preguntando cómo ejecutar realmente su script PHP desde cron, hay dos opciones: Llamar al intérprete PHP directamente (es decir, "php /foo/myscript.php"), o usar lynx (lynx http://mywebsite.com/myscript.php ). El que elija depende principalmente de cómo su script necesita su entorno configurado; las rutas y los permisos de acceso a los archivos serán diferentes dependiendo de si lo llama a través del shell o del navegador web. Yo recomendaría usar lince.
Un efecto secundario es que recibes un correo electrónico cada vez que se ejecuta. Para evitar esto, hago que mis scripts cron PHP PHP no produzcan nada (y tiene que ser nada, ni siquiera el espacio en blanco) si se completan con éxito, y un mensaje de error si fallan. Luego los llamo usando un pequeño script PHP de cron. De esta manera, solo recibo un correo electrónico si falla. Esto es básicamente lo mismo que el método de lince, excepto que mi script de shell realiza la solicitud de HTTP y no lynx.
Llame a este script "docron" o algo así (recuerde chmod + x), y luego use el comando en su crontab: "docron http://mydomain.com/myscript.php ". Le envía por correo electrónico el resultado de la página como un correo electrónico HTML, si la página devuelve algo.
#!/usr/bin/php
<?php
$h = @file_get_contents($_SERVER[''argv''][1]);
if ($h === false)
{
$h = "<b>Failed to open file</b>: " . $_SERVER[''argv''][1];
}
if ($h != '''')
{
@mail("[email protected]", $_SERVER[''argv''][''1''], $h, "From: [email protected]/nMIME-Version: 1.0/nContent-type: text/html; charset=iso-8859-1");
}
?>
Si tiene un host cPanel, puede agregar tareas cron a través de la interfaz web. Vaya a Avanzado -> Cron Jobs y use el formulario no avanzado para configurar la frecuencia cron. Quieres un comando como este:
/usr/bin/php /path/to/your/php/script.php
Si usa cpanel, debe agregar esto como:
/usr/local/bin/php -q /home/yoursite/public_html/yourfile.php