Wie erstelle ich einen Cron-Job mit PHP?

100

Ich bin neu in der Verwendung von Cron Job. Ich weiß nicht einmal, wie ich es schreiben soll. Ich habe versucht, über das Internet zu suchen, aber ich verstehe es immer noch nicht gut. Ich möchte einen Cron-Job erstellen, der meinen Code jede Minute ausführt. Ich benutze PHP, um es zu erstellen. Es funktioniert nicht.

Beispiel

run.php (Code, der jede Minute ausgeführt wird)

<?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");

?>

Angenommen, diese beiden Dateien befinden sich im selben Ordner.

Ist der Code, den ich falsch gemacht habe? Wenn dies nicht der Fall ist, teilen Sie mir bitte mit, wie das Problem behoben werden kann.

user2738520
quelle
Haben Sie Shell-Zugriff auf dem Server?
8
Sie können nicht einfach *** wiedergeben und erwarten, dass ein Cronjob erstellt wird. Lesen Sie hier, wie Sie Cronjobs erstellen (vorausgesetzt, Sie befinden sich auf einem Server unter Linux). Thesitewizard.com/general/set-cron-job.shtml
tlenss
@ Dragon: Ich weiß nichts darüber. Ich werde das überprüfen.
user2738520
Es ist ein einmaliges Ereignis, also benutzecrontab
Ed Heal

Antworten:

66

Dies ist die beste Erklärung für Code in PHP, die ich bisher gefunden habe:

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

Zusamenfassend:

Obwohl die Syntax zum Planen eines neuen Jobs auf den ersten Blick entmutigend erscheint, ist sie relativ einfach zu verstehen, sobald Sie sie aufgeschlüsselt haben. Ein Cron-Job hat immer fünf Spalten, von denen jede einen chronologischen 'Operator' darstellt, gefolgt vom vollständigen Pfad und dem auszuführenden Befehl:

* * * * * home / path / to / command / the_command.sh

Jede der chronologischen Spalten hat eine spezifische Relevanz für den Zeitplan der Aufgabe. Sie sind wie folgt:

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.

Geben Sie hier die Bildbeschreibung ein

Wenn man zum Beispiel am ersten Tag eines jeden Monats eine Aufgabe für 12 Uhr planen möchte, sieht sie ungefähr so ​​aus:

0 0 1 * * home / path / to / command / the_command.sh

Wenn wir eine Aufgabe planen möchten, die jeden Samstag um 8:30 Uhr ausgeführt wird, schreiben wir sie wie folgt:

30 8 * * 6 home / path / to / command / the_command.sh

Es gibt auch eine Reihe von Operatoren, mit denen der Zeitplan noch weiter angepasst werden kann:

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

Besuchen Sie den Link für den vollständigen Artikel, es erklärt:

  1. Was ist das Format des Cronjobs, wenn Sie ihn manuell eingeben / bearbeiten möchten?
  2. Verwendung von PHP mit SSH2-Bibliothek zur Authentifizierung als Benutzer, welche Crontab Sie bearbeiten möchten.
  3. Vollständige PHP-Klasse mit allen erforderlichen Methoden zur Authentifizierung, Bearbeitung und Löschung von Crontab-Einträgen.
Nikolay Ivanov
quelle
34

Auf die gleiche Weise, wie Sie versuchen, cron.php auszuführen, können Sie ein anderes PHP-Skript ausführen. Sie müssen dies jedoch über die CLI-Schnittstelle tun.

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

Fügen Sie dann der crontab einen Eintrag hinzu:

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

Wenn das Skript run.php ausführbare Berechtigungen hätte, könnte es direkt in der crontab aufgelistet werden, auch ohne den Teil / usr / bin / php. Der Teil 'env php' im Skript würde das geeignete Programm finden, um den PHP-Code tatsächlich auszuführen. Fügen Sie für die 'ausführbare' Version der Datei ausführbare Berechtigungen hinzu:

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

Fügen Sie dann den folgenden Eintrag in crontab hinzu:

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

Zu Alister hinzugefügt, können Sie die crontab normalerweise (nicht immer) bearbeiten, indem Sie crontab -e in einer ssh-Sitzung auf dem Server eingeben.

Die Sterne repräsentieren (* bedeutet jede dieser Einheiten):

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

Sie könnten etwas mehr über lesen diese hier .

Big Ginger Nerd
quelle
2

Geben Sie Folgendes in das Linux / Ubuntu-Terminal ein

 crontab -e 

Wählen Sie einen Editor aus (manchmal wird nach dem Editor gefragt) und dieser wird für jede Minute ausgeführt

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

Dies kann von Ihrem Webhost abhängen, wenn Sie keine eigenen Inhalte hosten. Wenn Ihr Webhost das Erstellen von Chron-Jobs unterstützt, können Sie möglicherweise ein Formular ausfüllen, in dem Sie die Häufigkeit auswählen und den absoluten Pfad zur auszuführenden Datei eingeben können. Mit meinem Webhost (DreamHost) kann ich beispielsweise benutzerdefinierte Cron-Jobs erstellen, indem ich den absoluten Pfad zur Datei eingebe und die Häufigkeit aus einem Auswahlmenü auswähle. Dies ist für Ihren Server möglicherweise nicht möglich. In diesem Fall müssen Sie die Crontab entweder direkt oder über Ihre hostspezifische Methode bearbeiten.

Erstellen Sie, wie oben von Alister Bulman beschrieben , eine PHP-Datei, die mithilfe der CLI ausgeführt werden soll (stellen Sie sicher, dass sie ganz #!/usr/bin/env phpam Anfang der Datei vor dem <?phpTag steht. Dadurch wird sichergestellt, dass die Shell weiß, welche ausführbare Datei beim Ausführen des Skripts aufgerufen werden soll.

Acharris
quelle
0

Warum benutzt du keine Locke? Wenn Sie eine PHP-Datei ausführen, führen Sie diese logischerweise per URL in Ihrem Browser aus. Es ist sehr einfach, wenn Sie Curl laufen

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
quelle
5
Dies würde theoretisch funktionieren, aber das PHP-Skript müsste die ganze Zeit laufen, was nicht gut ist.
Bestprogrammerintheworld
1
Sie müssen die Ausführungszeit von php-max auf 0 setzen, um dies für immer ausführen zu können. Auch wenn in Ihrem Skript ein Fehler auftritt, wird es erst wieder ausgeführt, wenn Sie es manuell neu starten.
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
quelle
6
Können Sie mir erklären, wie sehr ich mich für Ihre Codes interessiere?
Kostbarer Tom
0

Öffnen Sie zuerst Ihren SSH-Server mit Benutzername und Kennwort und wechseln Sie zum Standard-Root-Benutzer (Benutzer mit allen Berechtigungen). Führen Sie dann die folgenden Schritte aus:

  1. Geben Sie den Befehl crontab -ljetzt ein. Sie sehen die Liste aller Cronjobs.
  2. Geben Sie crontab -eeine Datei ein, in der alle Cron-Jobs geöffnet werden.
  3. Bearbeiten Sie die Datei mit Ihrem Cronjob-Zeitplan als min hr dayofmonth month dayofweek pathtocronjobfileund speichern Sie die Datei.
  4. Jetzt sehen Sie wieder eine Antwort. crontab: installing new crontabÜberprüfen Sie die Liste der Cronjobs, in denen Ihr Cron-Job aufgeführt ist.
Gokulpriya
quelle
0

Verwenden Sie für diese Aufgabe besser das Projekt Cron in Kombination mit dem Linux-Cronjob. Es ermöglicht Ihnen, Laufzeiten in Ihrem PHP-Code zu konfigurieren, Hintergrundjobs zu unterstützen und ist einfach zu bedienen.

Erster Schritt Rufen Sie jede Minute ein PHP-Skript auf:

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

Zweiter Schritt Verwenden Sie das cron / cron- Paket, um die Laufzeiten direkt in PHP zu konfigurieren.

$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'));

Sie haben die Details zur Verwendung im verknüpften Repository gefunden.

Thomas Eimers
quelle
-1

Erstellen Sie einen solchen Cronjob, an dem Sie jede Minute arbeiten können

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
rams0610
quelle
4
Ich denke, wir suchen nach Lösungen, um Cronjob mit PHP und ohne Terminal oder Cpanel zu erstellen. Ich möchte diese Lösungen auch nur mit PHP finden.
user3264863
-1

Es gibt eine einfache Möglichkeit, dies zu lösen: Sie können die PHP-Datei alle 1 Minute per Cron ausführen und in der ausführbaren PHP-Datei die Anweisung "if" ausführen, wenn die Zeit "jetzt" wie folgt ausgeführt wird

<?/** 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
quelle
4
Dies funktioniert nur, wenn Sie die Seite laden, im Grunde ist dies keine Lösung!
MD. Atiqur Rahman
Was ist, wenn ich den Browser schließe? Das scheitert!
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
quelle