Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2] Zadania CRON
Forum PHP.pl > Forum > PHP > Frameworki
damianooo
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. }
mcmaroon
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.



damianooo
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
prz3kus
  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
mcmaroon
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.