Laravel - uruchomienie polecenia na serwerze produkcyjnym

0

Cześć, jak uruchomić polecenie na serwerze zdalnym. Mam dostęp do ssh i chciałbym uruchomić php artisan queue:listen jednak po zamknięciu terminala polecenie się zakończy. Może uruchamiać polecenie cronem?

3

W takim celu wykorzystuje się multipleksery, np. byobu albo tmux - pozwalają one na uruchomienie aplikacji i odłączenie się od serwera tak, aby ta aplikacja nadal działała; przy czym to brzmi na problem X/Y - dlaczego musisz coś takiego uruchomić ręcznie? Co się stanie, gdy serwer zostanie np. uruchomiony ponownie?

5
ssquad napisał(a):

Cześć, jak uruchomić polecenie na serwerze zdalnym. Mam dostęp do ssh i chciałbym uruchomić php artisan queue:listen jednak po zamknięciu terminala polecenie się zakończy. Może uruchamiać polecenie cronem?

https://laravel.com/docs/8.x/queues#supervisor-configuration
Zainstaluj superrvisor, skonfiguruj tam 4 linijki i samo ci sie odpali kolejka jak sie nawet cos wykrzyczy, ja uywam od lat
polecam ci doinstalowac w larvaie pakiet HORIZIOn bedziesz mial pelny wglad na to co sie dzieje z kolejkami

3

Do poprzednich wypowiedzi bym jeszcze dodał, że uruchamianie kolejek jako long running process to nie jest dobre podejście w PHP. PHP nie został stworzony do obsługi takich długo żyjących procesów i wycieki pamięci prędzej czy później przekroczą dopuszczalny limit i się proces wywali pomijając już inne problemy typu wyraźne spowolnienie przy przetwarzaniu kolejnych elementów kolejki itp. Także ogólnie rozwiązanie zaproponowane przez @masterc jest słusznym podejściem. Proces z kolejką powinien być tak skonfigurowany aby co X przetworzonych elementów lub X sekund się autokilował a supervisor powinien to wykrywać i odpalać nowy proces. Odpalanie kolejek ręcznie przydaje się tylko w czasie developmentu - na produkcji się nie sprawdzi.

Tak jak pisał @Patryk27 da się tak odpalić proces aby był on aktywny po zakończeniu sesji terminala, ale to ślepa uliczka.

0

ogólnie przygotowałem skrypt, jednak skrypt nie wystartował z komunikatem

PHP Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.0.0". You are running 7.3.29. in

support napisał aby w skrypcie wywołać composera w następujący sposób

/usr/local/php80/bin/php /usr/local/bin/composer

jednak nie wiem jak to dodać do skryptu

3

Ten komunikat mówi, że masz niespełnione zależności - zapewne developowałeś używając php8 a na serwerze masz PHP 7.3
Musisz albo zmienić zależności w composerze albo zmienić wersję PHP na serwerze

Opcjonalnie możesz też spróbować usunąć na produkcji plik composer.lock i zrobić composer install wtedy - zapewne zadziała, ale ogólnie developowanie na innej wersji PHP niż używasz na serwerze to nie jest dobry pomysł bo mogą się pojawić bardziej subtelne błędy.

1

projekt mam w PHP 8.0, wersja na serwerze to też 8.0 (dla domeny) także ten błąd jest dla mnie zaskoczeniem. Może to dlatego że projekt jest w domenie x i dla domeny jest php 8 natomiast plik supervisor jest w katalogu głównym

1

Tal to bardzo prawdopodobne wyjaśnienie, supervisor działa w CLI więc ustawienia dla domeny zapewne go nie dotyczą. Musiałbyś się dowiedzieć jak ustawić wersję PHP dla CLI u Twojego providera.

5

Po prostu zamiast dawać php i korzystać ze zmiennych środowiskowych to dajesz cała ścieżkę do pliku wykonywanego np.
/usr/local/php80/bin/php artisan queue:listen

0

Dobra niuniek bo trzeba ci wyjaśnić elegancko, jakbyś to robił co dzień po 10 razy to byś wiedział, więc sugeruje się tym, że nigdy tego nie robiłeś. jeśli się mylę to przepraszam. Zasada jest taka:

Jeżeli lokalnie robisz jakieś zmiany i np dodajesz moduł czy jakąś paczkę w stylu composer required nazwa/paczki to ona ci sie instaluje, wiadomo. Teraz musisz zrobic git, commit, push i całe twoje zmiany lecą na gita gdzie każdy może sobie je dociągnąc pull. Jeżeli ja sobie wezme cały twój projekt ściągne to musze zrobić polecenie composer install w głównym katalogu aplikacji.

Pamiętaj, na produkcji nigdy nie rub composer update, zawsze rób composer install i taki myk robisz tylko raz. Nie ma czegoś takiego że dodajesz sobie composer do jakiegoś skryptu w cronie.

Twój błąd mówi wyraźnie

HP version ">= 8.0.0". You are running 7.3.2

Zależność jakaś wymaga php 8.0 lub większej. a ty masz 7.3 tam gdzie jest uruchomiona aplikacja. Musisz zobaczyć co to za zależność i dać wersje niższą lub zrobić issue żeby go zamienić, usunąć, lub żeby zrobić upgrade php do wersji 8.0

4

Dobra bo może zbyt płytko opisałem.
Uruchamiając z command line np. php -ver wywołujemy plik wykonywalny do którego ścieżkę ustalono w PATH inaczej system pokazałby, że nie jest w stanie uruchomić takiego programu bo nie umie go znaleźć w danym katalogu.
Zamiast więc wywoływać PHP w ten sposób można po prostu podać ścieżkę do pliku wykonywanego i pominąć to co jest ustawione w zmiennych środowiskowych.
@masterc
Czyli w tym supervisor można podać też ścieżkę do pliku

[program:laravel-worker]

command=path/to/correct/version/php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --max-time=3600
autostart=true

Tak samo z CMD można wywołać composera z właściwą wersją.

0

sposób o którym pierwszy wspomniał @jurek1980 działa, Dzięki :)

0

@hadwao:

@masterc: jakiej dziury? Przecież w ten sposób on właśnie odpala swój skrypt napisany w PHP 8 za pomocą PHP 8. To wg mnie całkiem prawidłowe rozwiązanie problemu i jeśli mam rację co do konfiguracji serwera to raczej inaczej tego nie uzyska. Chyba, że piszesz o jakimś innym problem i źle zrozumiałem.

Ja to zrozumailem tak: Mam lokalnie jakis program, mam tez php 8.0 loklanie tak? Wrzucam teraz comita i sobie merguje na produkcje. Na produkcji chce opdalic skrypt ale skrypt wykryl ze nowa wersja ktora zostala zaciagnieta na serwer produkcyjny dziala pod php 8.0 a obecna wrrsja to 7.3. Czyli wszystkie zaleznosci jakie powinny byc po zrobieniu PULL na produkcje i COMPOSER INSTALL nie zostaly zaktualizowane ani doinstalowane.

To pociaga za soba konsekwencje. I jeszcze sa dwa interpretery.? php8 i php 7 na produkcji? nie ogarniam tematu ale dla mnie to brzmi jak bialoruska granica, kto wie kiedy przeodstanie sie jakis imigranci bład na produkcji?

4

Źle rozumiesz. Kolega na serwerze ustawil php8 dla projektu, ale cli na serwerze było domyślnie odpalane w wersji 7.3, a zmiana na php8 była egzekwowana tylko przez konfigurację web serwera. Aby odpalić Cli używając interpretera php8 musi po prostu ominąć to co ma w Path i wywołać Interpreter php8 używając pełnej ścieżki. W ten sposób projekt ma w PhP8, we serwer używa interpretera php8 i teraz wywołania Cli też już używają php8.
Ogolnie trochę fackup w konfiguracji serwera po stronie firmy hostingowej, ale da się z tym żyć i teraz już wszystko jest ok.

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