Come creare cron job usando PHP?


100

Sono nuovo nell'usare cron job. Non so nemmeno come scriverlo. Ho provato a cercare da Internet, ma ancora non lo capisco bene. Voglio creare un cron job che eseguirà il mio codice ogni minuto. Sto usando PHP per crearlo. Non funziona.

Esempio

run.php (codice che verrà eseguito ogni 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");

?>

Supponiamo che questi due file si trovino nella stessa cartella.

Il codice che ho sbagliato è sbagliato? Se sbagliato, per favore dimmi gentilmente come risolverlo.


hai accesso alla shell sul server?

8
Non puoi semplicemente echeggiare *** e aspettarti che venga creato un cronjob. Leggi qui come creare cronjobs (supponendo che tu sia su un server che esegue Linux) thesitewizard.com/general/set-cron-job.shtml
tlenss

@ Dagon: non lo so. Lo guarderò.
user2738520

È un evento una tantum, quindi usacrontab
Ed Heal

Risposte:


66

Questa è la migliore spiegazione con il codice in PHP che ho trovato finora:

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

In breve:

Sebbene la sintassi della pianificazione di un nuovo lavoro possa sembrare scoraggiante a prima vista, in realtà è relativamente semplice da capire una volta scomposta. Un cron job avrà sempre cinque colonne ciascuna delle quali rappresenta un "operatore" cronologico seguito dal percorso completo e dal comando da eseguire:

* * * * * home / percorso / a / comando / il_comando.sh

Ciascuna delle colonne cronologiche ha una rilevanza specifica per la pianificazione dell'attività. Sono i seguenti:

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.

inserisci qui la descrizione dell'immagine

Quindi, ad esempio, se si volesse programmare un'attività per le 12 del primo giorno di ogni mese, sarebbe simile a questo:

0 0 1 * * home / percorso / a / comando / il_comando.sh

Se volessimo programmare un'attività da eseguire ogni sabato alle 8:30, la scriveremmo come segue:

30 8 * * 6 home / percorso / a / comando / il_comando.sh

Ci sono anche una serie di operatori che possono essere utilizzati per personalizzare ulteriormente la pianificazione:

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

Visita il link per l'articolo completo, spiega:

  1. Qual è il formato del cronjob se vuoi inserirlo / modificarlo manualmente.
  2. Come usare PHP con la libreria SSH2 per autenticare come utente, quale crontab stai per modificare.
  3. Classe PHP completa con tutti i metodi necessari per l'autenticazione, la modifica e l'eliminazione delle voci crontab.

34

Allo stesso modo in cui stai tentando di eseguire cron.php, puoi eseguire un altro script PHP. Tuttavia, dovrai farlo tramite l'interfaccia CLI.

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

Quindi, aggiungi una voce al crontab:

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

Se lo script run.php avesse i permessi eseguibili, potrebbe essere elencato direttamente nel crontab, senza anche la parte / usr / bin / php. La parte "env php", nello script, troverà il programma appropriato per eseguire effettivamente il codice PHP. Quindi, per la versione "eseguibile", aggiungi l'autorizzazione eseguibile al file:

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

quindi, aggiungi la seguente voce in crontab:

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

11

Aggiunto ad Alister, puoi modificare il crontab di solito (non sempre il caso) inserendo crontab -e in una sessione ssh sul server.

Le stelle rappresentano (* significa ogni unità di questa unità):

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

Potresti leggere qualcosa di più su questo qui .


2

Digita quanto segue nel terminale linux / ubuntu

 crontab -e 

seleziona un editor (a volte richiede l'editor) e questo viene eseguito ogni minuto

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

1

Ciò può dipendere dal tuo host web se non stai ospitando i tuoi contenuti. Se il tuo host web supporta la creazione di lavori chron, potrebbe avere un modulo da compilare che ti consente di selezionare la frequenza e inserire il percorso assoluto del file da eseguire. Ad esempio, il mio host web (DreamHost) mi consente di creare cron job personalizzati digitando il percorso assoluto del file e selezionando la frequenza da un menu di selezione. Questo potrebbe non essere possibile per il tuo server, nel qual caso devi modificare il crontab direttamente o tramite il metodo specifico del tuo host.

Come spiegato in precedenza da Alister Bulman , crea un file PHP da eseguire utilizzando la CLI (assicurandoti di includerlo #!/usr/bin/env phpall'inizio del file prima del <?phptag. Questo assicura che la shell sappia quale eseguibile deve essere invocato durante l'esecuzione dello script.


0

perchè non usi curl? logicamente, se esegui il file php, lo eseguirai tramite l'URL sul tuo browser. è molto semplice se esegui 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);
}

5
Questo funzionerebbe in teoria ma lo script php dovrebbe essere eseguito tutto il tempo, il che non è una buona cosa.
bestprogrammerintheworld

1
Devi impostare php-max-execution-time su 0 per eseguirlo per sempre. Inoltre, se si verifica un errore nello script, non verrà eseguito di nuovo fino a quando non lo riavvierai 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 &");
}


6
Per quanto mi interessino i tuoi codici, puoi spiegarmi?
Precious Tom

0

Per prima cosa apri il tuo server SSH con nome utente e password e passa all'utente root predefinito (Utente con tutte le autorizzazioni), quindi segui i passaggi seguenti,

  1. inserisci il comando crontab -lora vedrai l'elenco di tutti i cronjobs.
  2. inserire crontab -eun file con tutti i lavori di cron verranno aperti.
  3. Modifica il file con la tua pianificazione cronjob come min hr dayofmonth month dayofweek pathtocronjobfilee salva il file.
  4. Ora vedrai una risposta crontab: installing new crontabora controlla di nuovo l'elenco dei cronjob che il tuo cron job sarà elencato lì.

0

Utilizzare meglio il progetto Cron in combinazione con il cronjob di Linux per questa attività. Ti consente di configurare i tempi di esecuzione nel codice PHP, supportare i processi in background ed è facile da usare.

Il primo passaggio chiama uno script PHP ogni minuto:

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

Secondo passo usa il pacchetto cron / cron per configurare i tempi di esecuzione direttamente in 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'));

Hai trovato i dettagli su come utilizzare nel repository collegato.


-1

Crea un cronjob come questo per lavorare ogni minuto

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

4
Penso che stiamo cercando soluzioni per creare cronjob usando php e non usando alcun terminale o cpanel. Voglio anche trovare queste soluzioni usando solo php.
user3264863

-1

C'è un modo semplice per risolvere questo problema: puoi eseguire il file php da cron ogni 1 minuto, e all'interno del file eseguibile php fare l'istruzione "if" da eseguire quando l'ora "ora" come questa

<?/** 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 */
}

4
Funzionerà solo se carichi la pagina, fondamentalmente questa non è una soluzione!
MD. Atiqur Rahman

E se chiudo il browser? Questo fallisce!
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;
        }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.