Laravel - jak automatycznie wykonywać zadania?

0

Cześć!

Poszukuję rozwiązania, w jaki sposób automatycznie uruchamiać zadania w Laravelu. Potrzebuję stworzyć w swojej aplikacji harmonogram, który wysyłał by do użytkownika o określonej godzinie powiadomienie. Aktualnie w swojej aplikacji posiadam tabelę "harmonogram", która przechowuje godzinę i datę przypomnienia. Czytałem w dokumentacji o stworzeniu harmonogramu w Laravelu w dziale "task scheduling", ale nie wiem czy to jest dobry tok myślenia, jeżeli ktoś widzi jakąś lepszą metodę do tego rozwiązania to będę bardzo wdzięczny za pomoc. Aktualnie w głowie jedyne rozwiązanie jakie mam to sprawdzanie tabeli "harmonogram" co minutę, wyłapywanie odpowiednich godzin, a następnie wysłanie powiadomienia, aczkolwiek pewnie nie jest to zbyt rozważne rozwiązanie. Z góry dziękuję za wszelką pomoc i podpowiedzi.

4

Task scheduling, czyli to o czym czytałeś: https://laravel.com/docs/8.x/scheduling - to właściwe podejście.

1
  1. Dodajesz do CRON'a taki wpis jak poniżej dzieki temu co minute system sprawddza czy sa jakies zadania do wykonania
 * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
  1. Nastepnie wchodisz do projektu przez konto shell i z konsoli wpisuejsz: php artisan make:command MyTask
    to ci tworzy plik z katalogu app/console/commands/ w tym pliku piszesz kod jaki ma sie wykonac co okreslony czas
    w tym pliku dodajesz swoja komende na wykoanie go
protected $signature = 'synchronizuj:uzytkownikow';
  1. wchodzisz do katalogu app/console i edytujesz plik Kernel.php i dodajesz kod:
protected $commands = [
        // tu moze byc juz cos co jest wczeniej wiec dodajesz tylko  swoja linijke do swojego nowgo pliku
        'App\Console\Commands\ MyTask',
    ];

    protected function schedule(Schedule $schedule) {
        $schedule->command('synchronizuj:uzytkownikow')->everyFiveMinutes(); 
       // evry day  itd masz tu tabele
    }

tabela uruchamiania https://laravel.com/docs/8.x/scheduling#schedule-frequency-options

Dodatkowo jak wejdziesz przez shell z consoli do proejktu to wykonaj:

php artisan synchronizuj:uzytkownikow

i wykona sie twoj plik

0

Dziękuję bardzo za odpowiedzi, szczególnie @chomikowski za wyczerpującą wypowiedź. Jedyny problem jaki napotkałem aktualnie, to czy jest możliwość uruchomienia działania, podobnego do crontaba, ale na Windowsie? Właśnie musiałem przenieść projekt na Linuxa, bo na Windowsie jak utworzyłem zadanie uruchamiające artisan schedule:run, to zadanie działało tylko po ręcznym uruchomieniu. Zadanie w Windowsie utworzyłem za pomocą harmonogramu zadań, dodałem zadanie, widać było że działa, ale nie tworzyło jakiegokolwiek efektu. Może ktoś z was się z tym spotkał?Dodam jeszcze że zadanie próbowałem uruchamiać za pomocą php.exe i wywołania komendy artisan schedule:run, a także tworząc plik bat, i wywoływać go w harmonogramie zadań. Zawartośc pliku bat była następująca:

cd (tutaj była ścieżka do projektu)

(Tutaj była ścieżka do php zawartego w XAMPP) artisan schedule:run 1>> NUL 2>&1

Niestety żadne z rozwiązań nie działało. Zadania tworzyłem żeby były uruchamiane co minutę, a także żeby pokazywały okienka podczas uruchamiania, sprwdziłem kilkadziesiąt tutoriali ale żaden nie dał pozytywnego efektu na Windowsie 10. Z góry dziękuję za odpowiedź.

1

W Task Scheduler masz możliwość wyeksportowania zadania do XML. Wrzuć tego XMLa.

0

@Krispi One: Ja niestety na windowsie nie pracuje takze nie jestem w stanie pomoc jakby. Jezeli chodzi o to ze masz projekt na windowsie i chcesz go stworzyc a potem wrzucic na server to wlasnie wykonanie tego w konsoli php artisan synchronizuj:uzytkownikow odpali ci plik i sie wykona bys mogl sprawdzic czy dziala. Jezeli natomiast chodzi o crona i ten projekt ma dzialac na windowsie (bo moze masz wykupiony windows server) to nie wiem jak tam sie ustawia ale tu chlopaki wyzej pisali wiec pewnie to dziala.

Pozdrawiam

0

@chomikowski: dziękuję bardzo za pomoc, jednym wpisem dowiedziałem się bardzo wiele od Ciebie także więc dziękuję

@jurek1980 jeżeli to nie problem to wrzucę XML w postaci screena, chyba że będzie trzeba to podrzucę w wiadomości prywatnej.

screenshot-20201204232154.png

1

Masz Enable false W menu musisz po prostu kliknąć prawym przyciskiem myszy na tym tasku i kliknąć włącz.
Kawałek z XMLa ode mnie:

<Triggers>
    <CalendarTrigger>
      <Repetition>
        <Interval>PT1M</Interval>
        <Duration>P1D</Duration>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
      <StartBoundary>2020-12-04T23:28:48</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>MY UNIQUW USEr ID</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
0

@jurek1980: znaczy wyłączyłem zadanie żeby go wyeksportować bo jak widać jest ustawiony na uruchamianie co minutę i za każdym razem jak szukałem tego eksportu bardzo mi aplikacje ścinało, przed eksportem był cały czas włączony, i problem właśnie jest w tym że zadanie było włączone, zmieniał się czas następnego uruchomia, ale zauważyłem że ani razu się nie uruchomił, ponieważ nie zmieniał się czas ostatniego uruchomienia, jedynie zadanie się uruchamiało jak kliknąłem ręcznie włącz. Jeśli to ma znaczenie to korzystam z Windows 10 wersja Home. Jeżeli włączenie zadania pokazuje więcej danych w XML to zaraz dorzucę eksport włączonego zadania.

0

Hmm. No dobrze a co się stanie jak ręcznie zrobisz "Uruchom"? Po prawej masz informacje o stanie zadania kod 0X41301 to zadanie trwa. Kod 0x00 wyłączony. Co masz tutaj. Wersja windy raczej nie ma tu nic do rzeczy.

2

Po kliknięciu uruchom aktualnie tak wygląda zadanie:

screenshot-20201204235813.png

Edit:
Przepraszam, już zrozumiałem działanie harmonogramu, nie działał on, ponieważ zawsze wyznaczałem za późną godzinę wyzwolenia, czyli np. ustawiałem wyzwolenie harmonogramu na godzinę 12:00 każdego dnia, ale zanim wszystko sprawdziłem w formularzu, to zazwyczaj była już 12:01, przez co system czekał do 12:00 następnego dnia na wyzwolenie zadania, a nie wyzwalał go w ten sam dzień w którym go utworzyłem. Banalny błąd, ale nie sądziłem ze tak wpływa na program, byłem pewny że ustawie uruchomienie harmonogramu z dzisiejszą datą na 12:00 i potwierdzenie 12:01 to będzie działało, a tu niespodzianka, Windows traktował to jako oczekiwanie na wyzwolenie harmonogramu do następnego dnia. Dziękuję jeszcze raz za pomoc, aktualnie harmonogram działa wywołuję się co minute.

1 użytkowników online, w tym zalogowanych: 0, gości: 1