Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF][SF2][Symfony2] Zadania CRON, Jakie podejście w CommandClass ?
damianooo
post 7.02.2017, 21:52:54
Post #1





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Poczytałem trochę o zadaniach konsolowych w Symfony:
http://symfony.com/doc/current/console.html

Potrzebuję w stałym czasie (Poniedziałek 00:00) wykonać kilka zadań (oczywiście ustawię je na CRONie).
Będą to trzy zadania i każde będzie insertem/wieloma insertami danych do bazy danych.

Chciałem się poradzić jakie są dobre praktyki tworzenia takich zadań ? Mogę w metodzie execute() wrzucić logikę związaną z tworzeniem instancji klasy i wykonaniem na niej setów czy powinienem to wrzucić w innym miejscu np. Utils albo w serwisie a tutaj tylko wywoływać metodę innej klasy ?
I drugie pytanie: Czy na każde zadanie powinienem zrobić osobą klasę Command czy wrzucić wszystkie 3 (różne) zadania do jednej metody execute() jednej klasy Command ?

  1. Class MyCommend extend ContainerAwareCommand{
  2. configure(){}
  3.  
  4. execute(){
  5. ...
  6. foreach ($data as $key){
  7. $meet = new Meet();
  8. $meet->setUser($this->getUser());
  9. $meet->set....;
  10. $meet->set....;
  11. $em = $this->getDoctrine()->getManager();
  12. $em->persist($meet);
  13. }
  14. $em->flush();
  15. }
  16. }


Ten post edytował damianooo 7.02.2017, 21:55:30
Go to the top of the page
+Quote Post
mcmaroon
post 21.02.2017, 23:05:26
Post #2





Grupa: Zarejestrowani
Postów: 11
Pomógł: 5
Dołączył: 30.11.2016

Ostrzeżenie: (0%)
-----


Cytat
Mogę w metodzie execute() wrzucić logikę związaną z tworzeniem instancji klasy


Jasne że tak, przeszukaj w vendorach po słowie Command i zerknij.

Cytat
Czy na każde zadanie powinienem zrobić osobą klasę Command czy wrzucić wszystkie 3 (różne)


Jeśli jedno z tych zadań powinno chodzić co godzinę a drugie co 12 to jak najbardziej 3 różne lub też kolejna opcja. W configure dajesz wymagany addArgument np "method" i na podstawie tego argumentu wywołujesz metodę w komendzie
coś w tym stylu
  1. protected function execute(InputInterface $input, OutputInterface $output) {
  2. $method = $input->getArgument('method');
  3. if(method_exists($this, $method)){
  4.  
  5. }
  6. }


I jeszcze jedno. Jeśli zadań na encjach jest sporo to do tego kodu
  1. $em = $this->getDoctrine()->getManager();


koniecznie dodaj

  1. $em->getConnection()->getConfiguration()->setSQLLogger(null);


Mocno przyśpiesza i oszczędza dużo pamięci.



Go to the top of the page
+Quote Post
damianooo
post 22.02.2017, 19:34:41
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Ok to jeszcze tylko pytanie jak to będzie działać na serwerze hostingowym ?

Do tej pory miałem tak że wskazywałem w poleceniu CRON jaki plik ma zostać uruchomiony o wybranej godzinie w ten sposób:
  1. php -q /home/opl/public_html/crontask.php


Rozumiem że jak na serwer hostingowy wrzucę swoją aplikację Symfony to wskażę plik MyCommend.php a polecnie będzie wraz ze ścieżką takie ? :

  1. php -q /home/opl/public_html/src/AppBundle/Command/MyCommend.php


?

Bo właśnie tego nie mogę nigdzie w sieci znaleźć sad.gif

Ten post edytował damianooo 22.02.2017, 19:34:59
Go to the top of the page
+Quote Post
prz3kus
post 23.02.2017, 08:52:13
Post #4





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

Ostrzeżenie: (0%)
-----


  1. class TimeReportCommand extends ContainerAwareCommand
  2. {
  3. protected function configure()
  4. {
  5. $this
  6. ->setName('time-report')
  7. ->setDescription('Time report')
  8. ;
  9. }
  10.  
  11. protected function execute(InputInterface $input, OutputInterface $output)
  12. {


Powyżej przykładowa klasa wysołujsz ją po nazwie, poleceniem konsolowym czyli:

Cytat
php bin/console time-report


czyli w cronie podajesz np.
Cytat
php -q /home/opl/public_html/PROJEKT/bin/console time-report


Mam nadzieje, że już jasne wink.gif
Go to the top of the page
+Quote Post
mcmaroon
post 23.02.2017, 09:22:34
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 5
Dołączył: 30.11.2016

Ostrzeżenie: (0%)
-----


Lokalnie, tak jak napisał prz3kus
Kod
php bin/console time-report

A na produkcji to ja mam np
Kod
/usr/local/bin/php  bin/console time-report > /dev/null 2>&1


Ten post edytował mcmaroon 23.02.2017, 09:23:03
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 17:32