Michał Stanowski

Michał Stanowski magik od php i
wordpress

Temat: Uruchamianie Akcji poprzez konsolę

Długo szukałem odpowiedzi na moje pytanie. Przypadek jest taki, że daną czynność chcę móc uruchamiać webowo jak i z konsoli. Wszędzie znajdywałem jakieś dziwne odpowiedzi nie pasujące do postawionych problemów ;] Oto rozwiązanie:


// tutaj standardowa zawartosc public_html/index.php bez ostatniej linii

$application->bootstrap();
$front = $application->getBootstrap()->getResource('FrontController');
$front->setParam('disableOutputBuffering', true);
$front->setDefaultControllerName('cron')->setDefaultAction('products');
$application->run();


To pozwoli nam uruchomić z konsoli akcję Products kontrolera Cron. Wyłączam też buforowanie wyjścia, aby móc na bieżąco śledzić w konsoli wyświetlane komunikaty.

Ktoś ma na to jakąś inną/lepszą metodę?
Pzdr

konto usunięte

Temat: Uruchamianie Akcji poprzez konsolę

Też się mocno głowiłem nad tym problemem i wpadłem na dwa rozwiązania.

1.
Poza katalogiem public znajduje się plik cli.php, który wygląda podobnie jak index.php, za wyjątkiem metody bootstrap. Ponieważ wiersz poleceń nie potrzebuje wszystkich zasobów, wywołuję tylko te, które rzeczywiście mogą się przydać (config, db, translate, itp). Każdy skrypt dołącza cli.php, a następnie robi swoje, najczęściej wywołuje jakąś metodę z modelu, która zajmuje się resztą. Sprawdzone i działa.

2.
Drugi pomysł jest modyfikacją pierwszego. Ten sam skrypt cli.php odpalany jest w cronie razem z parametrem. Parametrem tym jest nazwa skryptu jaki ma się wykonać. Plik cli.php na samym końcu ładuje skrypt wskazany w parametrze i go wykonuje. Jeszcze nie sprawdzone.
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Uruchamianie Akcji poprzez konsolę

Ja mam u siebie nieco zmodyfikowany patent z artykyłu: Making Zend Framework Applications CLI Accessible

Mam swoją klasę Bootstrap która inicjuje aplikację tak jak Maciek napisał w pkt 1, wyłączajac niepotrzebne komponenty.
Bootstrap dodatkowo izoluje kontrolery wykorzystane w CLI od tych dostępnych przez HTTP oraz mapuje dodatkowe opcjonalne argumenty przekazane z linii poleceń, jako parametry które są dostępne w klasie request w kontrolerze.

Konfigurację trzymam w osobnym pliku ini tak jak napisano w artykule.

Odpalenie skryptów z konsoli sprowadza się do wprowadzenia URI skryptu który chcemy odpalić.
URI z wykorzystaniem standardowego routingu Zenda wygląda to mniej więcej tak:

cli.php module/controller/action


Można też tak:
cli.php controller/action


Oraz tak:
cli.php controller/action --foo=bar --environment=development --itp=itd
Michał Stanowski

Michał Stanowski magik od php i
wordpress

Temat: Uruchamianie Akcji poprzez konsolę

Maciej Wilgucki:
, wywołuję tylko te, które rzeczywiście mogą się przydać (config, db,
translate, itp).

Właśnie... skąd brać nazwy tych zasobów? Bo np. Klasa nazywa się Zend_Controller_Front a zasób już FrontController :/

Po drugie, to co opisałeś jest nieco czym innym od tego o co mnie chodziło :]
W moim rozwiązaniu chodziło o odpalenie z CLI dokładnie tego samego kodu/akcji która uruchamiana jest przez HTTP. Twój opis, mimo że poprawny i przydatny, mówi tylko o tym jak załadować środowisko Zenda w CLI i wykonać jakieś tam operację zamieszczając kod bezpośrednio w skrypcie. Tutaj bliżej moich potrzeb jest to co opisał Przemek.
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Uruchamianie Akcji poprzez konsolę

Michał,

Nazwy zasobów znajdziesz w katalogu Zend/Application/Resource

Żeby odpalić dokładnie ten sam kod z poziomu CLI oraz HTTP używając sposobu podanego przeze mnie, po prostu nie izoluj kontrolerów CLI i HTTP. Ustaw sobie bootstrapper CLI i HTTP na te same katalogi z kontrolerami :)

konto usunięte

Temat: Uruchamianie Akcji poprzez konsolę

Michał Stanowski:
Właśnie... skąd brać nazwy tych zasobów? Bo np. Klasa nazywa się Zend_Controller_Front a zasób już FrontController :/

Do zasobów, o których napisał Przemek, dochodzą jeszcze Twoje własne. Jeśli tworzyłeś metody w pliku bootstrap, to każda z metod jest również zasobem, a jego nazwa jest taka sama jak nazwa metody bez przedrostka _init.



Wyślij zaproszenie do