¿Cómo crear un trabajo cron usando PHP?

100

Soy nuevo en el uso de cron job. Ni siquiera sé cómo escribirlo. He intentado buscar en Internet, pero todavía no lo entiendo bien. Quiero crear un trabajo cron que ejecutará mi código cada minuto. Estoy usando PHP para crearlo. No está trabajando.

Ejemplo

run.php (Código que se ejecutará cada minuto)

<?php

echo "This code will run every minute";

?>

cron.php

<?php

$path = dirname(__FILE__);
$cron = $path . "/run.php";
echo exec("***** php -q ".$cron." &> /dev/null");

?>

Suponga que estos dos archivos están en la misma carpeta.

¿El código que hice mal? Si está mal, por favor dígame cómo solucionarlo.

usuario2738520
fuente
¿tiene acceso de shell en el servidor?
8
No puede simplemente hacer eco de *** y esperar que se cree un cronjob. Lea aquí cómo crear cronjobs (asumiendo que está en un servidor que ejecuta linux) thesitewizard.com/general/set-cron-job.shtml
tlenss
@Dagon: no sé nada de esto. Lo comprobaré.
user2738520
Es un evento único, así que utilícelocrontab
Ed Heal

Respuestas:

66

Esta es la mejor explicación con código en PHP que he encontrado hasta ahora:

http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

En breve:

Aunque la sintaxis para programar un nuevo trabajo puede parecer desalentadora a primera vista, en realidad es relativamente fácil de entender una vez que la desglosa. Un trabajo cron siempre tendrá cinco columnas, cada una de las cuales representa un 'operador' cronológico seguido de la ruta completa y el comando para ejecutar:

* * * * * inicio / ruta / a / comando / the_command.sh

Cada una de las columnas cronológicas tiene una relevancia específica para el horario de la tarea. Son los siguientes:

Minutes represents the minutes of a given hour, 0-59 respectively.
Hours represents the hours of a given day, 0-23 respectively.
Days represents the days of a given month, 1-31 respectively.
Months represents the months of a given year, 1-12 respectively.
Day of the Week represents the day of the week, Sunday through Saturday, numerically, as 0-6 respectively.

ingrese la descripción de la imagen aquí

Entonces, por ejemplo, si uno quisiera programar una tarea para las 12 a. M. El primer día de cada mes, se vería así:

0 0 1 * * inicio / ruta / a / comando / the_command.sh

Si quisiéramos programar una tarea para que se ejecute todos los sábados a las 8:30 am, la escribiríamos de la siguiente manera:

30 8 * * 6 inicio / ruta / a / comando / the_command.sh

También hay varios operadores que se pueden utilizar para personalizar aún más el horario:

Commas is used to create a comma separated list of values for any of the cron columns.
Dashes is used to specify a range of values.
Asterisksis used to specify 'all' or 'every' value

Visite el enlace para ver el artículo completo, explica:

  1. ¿Cuál es el formato del cronjob si desea ingresarlo / editarlo manualmente?
  2. Cómo usar PHP con la biblioteca SSH2 para autenticarse como usuario, qué crontab va a editar.
  3. Clase PHP completa con todos los métodos necesarios para la autenticación, edición y eliminación de entradas crontab.
Nikolay Ivanov
fuente
34

De la misma manera que está intentando ejecutar cron.php, puede ejecutar otro script PHP. Sin embargo, tendrá que hacerlo a través de la interfaz CLI.

#!/usr/bin/env php
<?php
# This file would be say, '/usr/local/bin/run.php'
// code
echo "this was run from CRON";

Luego, agregue una entrada al crontab:

* * * * * /usr/bin/php -f /usr/local/bin/run.php &> /dev/null

Si el script run.php tenía permisos ejecutables, podría aparecer directamente en el crontab, sin la parte / usr / bin / php también. La parte 'env php', en el script, encontraría el programa apropiado para ejecutar realmente el código PHP. Entonces, para la versión 'ejecutable', agregue el permiso ejecutable al archivo:

chmod +x /usr/local/bin/run.php

y luego, agregue la siguiente entrada en crontab:

* * * * * /usr/local/bin/run.php &> /dev/null
Alister Bulman
fuente
11

Agregado a Alister, puede editar el crontab generalmente (no siempre es el caso) ingresando crontab -e en una sesión ssh en el servidor.

Las estrellas representan (* significa cada parte de esta unidad):

[Minute] [Hour] [Day] [Month] [Day of week (0 =sunday to 6 =saturday)] [Command]

Puedes leer un poco más sobre esto aquí .

Gran jengibre nerd
fuente
2

Escriba lo siguiente en la terminal linux / ubuntu

 crontab -e 

seleccione un editor (en algún momento solicita el editor) y esto se ejecutará cada minuto

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
madhu131313
fuente
1

Eso puede depender de su proveedor de alojamiento web si no aloja su propio contenido. Si su proveedor de alojamiento web admite la creación de trabajos cronológicos, es posible que tenga un formulario para que lo complete y que le permita seleccionar la frecuencia e ingresar la ruta absoluta al archivo para ejecutar. Por ejemplo, mi servidor web (DreamHost) me permite crear trabajos cron personalizados escribiendo la ruta absoluta al archivo y seleccionando la frecuencia en un menú de selección. Es posible que esto no sea posible para su servidor, en cuyo caso debe editar el crontab directamente o mediante el método específico de su host.

Como Alister Bulman detalla arriba, cree un archivo PHP para ejecutar usando CLI (asegurándose de incluirlo #!/usr/bin/env phpal principio del archivo antes de la <?phpetiqueta. Esto asegura que el shell sepa qué ejecutable debe ser invocado al ejecutar el script.

acharris
fuente
0

¿Por qué no usas curl? lógicamente, si ejecuta un archivo php, lo ejecutará por url en su navegador. es muy simple si corres curl

while(true)
{
    sleep(60); // sleep for 60 sec = 1 minute

    $s = curl_init();
    curl_setopt($s,CURLOPT_URL, $your_php_url_to_cron); 
    curl_exec($s); 
    curl_getinfo($s,CURLINFO_HTTP_CODE); 
    curl_close($s);
}
Ecko Santoso
fuente
5
Esto funcionaría en teoría, pero el script php tendría que ejecutarse todo el tiempo, lo cual no es bueno.
bestprogrammerintheworld
1
Debe establecer php-max-execution-time en 0 para ejecutar esto para siempre. Además, si ocurre algún error en su secuencia de comandos, no se ejecutará nuevamente hasta que lo reinicie manualmente.
Hassan Raza
0

$command = "php ".CRON_PATH.php ";
if(substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $command, "r"));
}else{
shell_exec($command ." > /dev/null &");
}

shubhi agrawal
fuente
6
Por mucho que me interesen sus códigos, ¿puede explicarme?
Precious Tom
0

Primero abra su servidor SSH con nombre de usuario y contraseña y cambie al usuario raíz predeterminado (Usuario con todos los permisos) luego siga los pasos a continuación,

  1. ingrese el comando crontab -lahora verá la lista de todos los cronjobs.
  2. ingrese crontab -eun archivo con todos los trabajos cron.
  3. Edite el archivo con su programa cronjob min hr dayofmonth month dayofweek pathtocronjobfiley guárdelo.
  4. Ahora verá una respuesta crontab: installing new crontabahora nuevamente, verifique la lista de cronjobs donde su trabajo cron aparecerá en la lista.
Gokulpriya
fuente
0

Es mejor utilizar el proyecto Cron en combinación con el cronjob de Linux para esta tarea. Le permite configurar tiempos de ejecución en su código PHP, admite trabajos en segundo plano y es fácil de usar.

Primer paso llamar a un script PHP cada minuto:

* * * * * /usr/local/bin/run.php &> /dev/null

Segundo paso use el paquete cron / cron para configurar los tiempos de ejecución directamente en PHP.

$deprecatedStatus = new ShellJob();
$deprecatedStatus->setCommand('cd /app && /usr/local/bin/php cron/updateDeprecatedStatus.php');
$deprecatedStatus->setSchedule(new CrontabSchedule('* * * * */2'));


$displayDate = new ShellJob();
$displayDate->setCommand('cd /app && /usr/local/bin/php cron/updateDisplayDate.php');
$displayDate->setSchedule(new CrontabSchedule('* * * * */5'));

Encontró los detalles de cómo usarlo en el repositorio vinculado.

Thomas Eimers
fuente
-1

Crea un cronjob como este para trabajar en cada minuto

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
rams0610
fuente
4
Creo que estamos buscando soluciones para crear cronjob usando php y no usando ninguna terminal o cpanel. También quiero encontrar estas soluciones usando solo php.
user3264863
-1

Hay una manera simple de resolver esto: puede ejecutar el archivo php por cron cada 1 minuto, y dentro del archivo ejecutable php, haga una declaración "if" para ejecutar cuando el tiempo "ahora" sea así

<?/** suppose we have 1 hour and 1 minute inteval 01:01 */

$interval_source = "01:01";
$time_now = strtotime( "now" ) / 60;
$interval = substr($interval_source,0,2) * 60 + substr($interval_source,3,2);


if( $time_now % $interval == 0){
/** do cronjob */
}
maxkuku
fuente
4
Esto solo funcionará si carga la página, ¡básicamente esta no es una solución!
MD. Atiqur Rahman
¿Qué pasa si cierro el navegador? ¡Esto falla!
Resheil Agarwal
-2
function _cron_exe($schedules) {
        if ($obj->get_option('cronenabledisable') == "yes") {
            // $interval = 1*20;
            $interval = $obj->get_option('cronhowtime');
            if ($obj->get_option('crontiming') == 'minutes') {
                $interval = $interval * 60;
            } else if ($obj->get_option('crontiming') == 'hours') {
                $interval = $interval * 3600;
            } else if ($obj->get_option('crontiming') == 'days') {
                $interval = $interval * 86400;
            }
            $schedules['hourlys'] = array(
                'interval' => $interval,
                'display' => 'cronjob'
            );
            return $schedules;
        }

}
Ranjith
fuente