Laravel - jak automatycznie wykonywać zadania?

Laravel - jak automatycznie wykonywać zadania?
KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:19 dni
  • Postów:125
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.

jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:3457
4

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

CH
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:449
1
  1. Dodajesz do CRON'a taki wpis jak poniżej dzieki temu co minute system sprawddza czy sa jakies zadania do wykonania
Kopiuj
 * * * * * 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
Kopiuj
protected $signature = 'synchronizuj:uzytkownikow';
  1. wchodzisz do katalogu app/console i edytujesz plik Kernel.php i dodajesz kod:
Kopiuj
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:

Kopiuj
php artisan synchronizuj:uzytkownikow

i wykona sie twoj plik

edytowany 1x, ostatnio: chomikowski
KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:19 dni
  • Postów:125
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:

Kopiuj
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ź.

jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:3457
1

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

CH
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:449
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

KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:19 dni
  • Postów:125
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

jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:3457
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:

Kopiuj
<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>
KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:19 dni
  • Postów:125
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.

edytowany 1x, ostatnio: Krispi One
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:3457
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.

KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:19 dni
  • Postów:125
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.

edytowany 2x, ostatnio: Krispi One
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)