Jak stworzyć zadanie cron za pomocą PHP?

100

Jestem nowy w używaniu zadania cron. Nie wiem nawet, jak to napisać. Próbowałem wyszukiwać w Internecie, ale nadal nie rozumiem tego dobrze. Chcę utworzyć zadanie cron, które będzie wykonywać mój kod co minutę. Do jego tworzenia używam PHP. To nie działa.

Przykład

run.php (kod, który będzie wykonywany co minutę)

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

?>

Załóżmy, że te dwa pliki znajdują się w tym samym folderze.

Czy kod, który zrobiłem jest zły? Jeśli jest źle, uprzejmie powiedz mi, jak to naprawić.

user2738520
źródło
czy masz dostęp do powłoki na serwerze?
8
Nie możesz po prostu odbijać echa *** i oczekiwać, że zostanie utworzona praca cron. Przeczytaj tutaj, jak tworzyć cronjobs (zakładając, że jesteś na serwerze z systemem Linux) thesitewizard.com/general/set-cron-job.shtml
tlenss
@Dagon: nie wiem o tym. Sprawdzę to.
user2738520
Jest to jednorazowe wydarzenie, więc użyjcrontab
Ed Heal

Odpowiedzi:

66

To najlepsze wyjaśnienie z kodem w PHP, jakie do tej pory znalazłem:

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

W skrócie:

Chociaż na pierwszy rzut oka składnia planowania nowej pracy może wydawać się zniechęcająca, w rzeczywistości jest ona stosunkowo łatwa do zrozumienia, gdy ją zepsujesz. Zadanie cron zawsze będzie miało pięć kolumn, z których każda reprezentuje chronologiczny `` operator '', po którym następuje pełna ścieżka i polecenie do wykonania:

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

Każda z kolumn chronologicznych ma określone znaczenie dla harmonogramu zadania. Są one następujące:

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.

wprowadź opis obrazu tutaj

Na przykład, jeśli ktoś chciałby zaplanować zadanie na 12 rano pierwszego dnia każdego miesiąca, wyglądałoby to mniej więcej tak:

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

Gdybyśmy chcieli zaplanować uruchamianie zadania w każdą sobotę o 8:30, zapisalibyśmy to w następujący sposób:

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

Istnieje również wielu operatorów, których można użyć do dalszego dostosowania harmonogramu:

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

Odwiedź link do pełnego artykułu, który wyjaśnia:

  1. Jaki jest format cronjob, jeśli chcesz wprowadzić / edytować go ręcznie.
  2. Jak używać PHP z biblioteką SSH2 do uwierzytelniania jako użytkownik, którego crontab zamierzasz edytować.
  3. Pełna klasa PHP ze wszystkimi niezbędnymi metodami uwierzytelniania, edycji i usuwania wpisów crontab.
Nikolay Ivanov
źródło
34

W ten sam sposób, w jaki próbujesz uruchomić cron.php, możesz uruchomić inny skrypt PHP. Będziesz musiał to jednak zrobić za pośrednictwem interfejsu CLI.

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

Następnie dodaj wpis do tabeli crontab:

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

Gdyby skrypt run.php miał uprawnienia do wykonywania, mógłby zostać wyświetlony bezpośrednio w tabeli crontab, bez części / usr / bin / php. Część „env php” w skrypcie mogłaby znaleźć odpowiedni program do rzeczywistego uruchomienia kodu PHP. Tak więc dla wersji `` wykonywalnej '' - dodaj uprawnienia do pliku wykonywalnego do pliku:

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

a następnie dodaj następujący wpis do crontab:

* * * * * /usr/local/bin/run.php &> /dev/null
Alister Bulman
źródło
11

Dodany do Alistera, możesz zazwyczaj edytować crontab (nie zawsze tak jest), wpisując crontab -e w sesji ssh na serwerze.

Gwiazdy reprezentują (* oznacza każdą z tej jednostki):

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

Możesz przeczytać więcej na ten temat tutaj .

Big Ginger Nerd
źródło
2

Wpisz następujące polecenie w terminalu linux / ubuntu

 crontab -e 

wybierz edytora (czasami prosi o edytora) i to działa co minutę

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
madhu131313
źródło
1

Może to zależeć od Twojego usługodawcy hostingowego, jeśli nie hostujesz własnych treści. Jeśli Twój usługodawca hostingowy obsługuje tworzenie zadań chronionych, może mieć formularz do wypełnienia, który pozwala wybrać częstotliwość i wprowadzić bezwzględną ścieżkę do pliku do wykonania. Na przykład mój host sieciowy (DreamHost) umożliwia mi tworzenie niestandardowych zadań cron, wpisując bezwzględną ścieżkę do pliku i wybierając częstotliwość z menu wyboru. Może to nie być możliwe dla twojego serwera, w takim przypadku musisz edytować plik crontab bezpośrednio lub za pomocą metody specyficznej dla twojego hosta.

Jak wyszczególnił Alister Bulman powyżej, utwórz plik PHP do uruchomienia przy użyciu CLI (pamiętaj, aby umieścić go #!/usr/bin/env phpna samym początku pliku przed <?phpznacznikiem. Dzięki temu powłoka wie, który plik wykonywalny powinien zostać wywołany podczas uruchamiania skryptu.

acharris
źródło
0

dlaczego nie używasz curl? logicznie rzecz biorąc, jeśli uruchomisz plik php, wykonasz go za pomocą adresu URL w przeglądarce. jego bardzo proste, jeśli uruchomisz 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
źródło
5
To by działało w teorii, ale skrypt php musiałby działać cały czas, co nie jest dobrą rzeczą.
bestprogrammerintheworld
1
Musisz ustawić czas wykonywania php-max na 0, aby uruchamiać to wiecznie. Również jeśli wystąpi jakiś błąd w skrypcie, nie zostanie on wykonany ponownie, dopóki nie uruchomisz go ręcznie.
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
źródło
6
Chociaż bardzo interesują mnie twoje kody, czy możesz to wyjaśnić?
Cenny Tom
0

Najpierw otwórz serwer SSH z nazwą użytkownika i hasłem i zmień na domyślnego użytkownika root (użytkownika ze wszystkimi uprawnieniami), a następnie wykonaj poniższe czynności,

  1. wprowadź polecenie crontab -lteraz zobaczysz listę wszystkich cronjobów.
  2. wprowadź crontab -eplik, w którym zostaną otwarte wszystkie zadania cron.
  3. Edytuj plik zgodnie z harmonogramem cronjob min hr dayofmonth month dayofweek pathtocronjobfilei zapisz plik.
  4. Teraz zobaczysz odpowiedź, crontab: installing new crontabteraz ponownie sprawdź listę cronjobs, na której zostanie wyświetlone zadanie cron.
Gokulpriya
źródło
0

Lepiej użyj projektu Cron w połączeniu z Linux cronjob do tego zadania. Umożliwia konfigurację czasu działania w kodzie PHP, obsługuje zadania w tle i jest łatwy w użyciu.

Pierwszy krok wywołuj skrypt PHP co minutę:

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

W drugim kroku użyj pakietu cron / cron, aby skonfigurować czasy wykonywania bezpośrednio w 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'));

Znalazłeś szczegółowe informacje, jak używać w połączonym repozytorium.

Thomas Eimers
źródło
-1

Stwórz taką cronjob, która będzie działać w każdej minucie

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
rams0610
źródło
4
Myślę, że szukamy rozwiązań do tworzenia cronjob przy użyciu php i bez użycia terminala lub panelu sterowania. Chcę również znaleźć to rozwiązanie tylko przy użyciu php.
user3264863
-1

Jest prosty sposób na rozwiązanie tego problemu: możesz uruchomić plik php przez crona co 1 minutę, a wewnątrz pliku wykonywalnego php wykonaj instrukcję "if", która ma być wykonana, gdy czas "teraz" wygląda tak

<?/** 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
źródło
4
To zadziała tylko wtedy, gdy załadujesz stronę, w zasadzie to nie jest rozwiązanie!
MD. Atiqur Rahman
A jeśli zamknę przeglądarkę? To się nie udaje!
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
źródło