Zaplanowana wysyłka e-maili z systemów Linux i Windows |
Zaplanowana wysyłka e-maili z systemów Linux i Windows |
30.08.2022, 17:11:13
Post
#1
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Przeczytałem, iż można planować wysyłkę e-maili w PHP z użyciem biblioteki ssh2 oraz Cron'a. Problem jest taki, iż Cron działa pod Linux'em, ale nie działa pod Windows. Da się to jakoś rozwiązać, aby zaplanować wysyłkę tych e-maili zarówno pod systemem Linux oraz Windows? Aby skrypt działał pod oba systemami operacyjnymi jednocześnie... Bo średnio mi się uśmiecha instalować Linux'a oraz PHP i MySQL'a pod tym systemem operacyjnym. Obecnie programuję pod Windows.
Ten post edytował eerie 30.08.2022, 17:14:08 |
|
|
30.08.2022, 17:24:40
Post
#2
|
|
Grupa: Zarejestrowani Postów: 343 Pomógł: 70 Dołączył: 15.07.2014 Ostrzeżenie: (0%) |
Można. https://blog.meloniq.net/2010/01/21/jak-uru...em-cron-na-win/
PS. Dlaczego nie korzystasz z Dockera? Wtedy masz taki system jaki tylko chcesz. Plus, teraz pod Windowsem możesz pracować na luzie z użyciem Linuxa -> WSL: https://docs.microsoft.com/en-us/windows/wsl/about |
|
|
30.08.2022, 17:25:55
Post
#3
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cron to nic innego jak odpalanie jakiegos zadania o zadanym czasie.
Poszukaj wiec w google odpowiednika cron dla Windows google: windows cron -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
6.09.2022, 19:28:53
Post
#4
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Dzięki za wskazówki... I sorry za moje pytanie, ale muszę dopytać...
Zainstalowałem najnowszy "Docker Desktop" oraz system Linux "Ubuntu" (WSL). Domyślam się, iż muszę jakoś stworzyć obraz bazowy dla Docker'a, który będzie zawierał PHP + MySQL (najlepiej XAMPP dla Linux). Potem zbudować obraz mojej aplikacji, który będzie korzystał z obrazu bazowego. Następnie uruchomić kontener... Tylko zbytnio nie rozumiem, gdzie mam umieścić pliki mojej aplikacji? Może być tam, gdzie jest do tej pory, lub muszę ją jakoś przegrać, aby była widoczna z Linux'a? Sorry za moje pytania, ale ukończyłem zaledwie roczne informatyczne studia podyplomowe i nie miałem zbytnio styczności z Linux'em i Docker'em do tej pory. Będę wdzięczny za jakiekolwiek kolejne wskazówki. DODANE 06.09.2022: Ok. Przeczytałem 2 razy artykuł poniżej i już zrozumiałem to i owo... Jeśli możecie polecić coś lepszego, proszę o link. https://frontstack.pl/docker-dockerfile-tworzenie-obrazow/ Generalnie rozumiem już, iż mogę programować, jak robiłem to do tej pory. Potem, przed sprawdzeniem efektów zmian kodu PHP w wyszukiwarce, muszę odbudować obraz mojej aplikacji webowej. Zmienione pliki są do niego wciągane, odpalam kontener i mogę sobie sprawdzić, jak aplikacja działa pod Linux'em... W artykule jest informacja, iż można użyć gotowych obrazów systemu Linux, Apache'a, MySQL'a. Najlepszym miejscem na wyszukanie obrazów bazowych jest DockerHub. Tylko widzę, że taki obraz "httpd" jest pod system Linux Alpine, a "mysql" pod Debian. Domyślam się, iż muszę poszukać wersji np. MySQL'a, która działa pod np. Ubuntu, którego chcę używać... Pozostaje kwestia konfiguracji np. Apache'a HTTP Server, aby jego plik konfiguracyjny wskazywał na folder, gdzie znajduje się moja aplikacja. Jak to najłatwiej zrobić? Jakoś podmienić plik "httpd.conf" w Apache'u po załadowaniu gotowego obrazu? Ten post edytował eerie 6.09.2022, 19:32:12 |
|
|
7.09.2022, 08:36:45
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Utwórz sobie plik docker-compose.yml (i poszukaj o nim informacji) w którym wrzucisz zależności i mapowania. Przykładowo jeśli w obrazie php chcesz aby twój lokalny folder z plikami projektu wskazywał na jakiś folder www to robisz
Kod version: "3" services: php: volumes: - /moj_folder_na_dysku:/var/www #czyli po wykonaniu docker exec -it php bash i cd /var/www będziesz widział pliki z lokalnego dysku Dodatkowo mały hint. Jeżeli chcesz dodawać rozszerzenia do obrazu php (sugeruję raczej wersję na debianie, alpine mimo że mniejszy to potrafi robić problemy) to najlepiej przez https://github.com/mlocati/docker-php-extension-installer Ten post edytował viking 7.09.2022, 08:37:16 -------------------- |
|
|
12.09.2022, 20:09:08
Post
#6
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Poradziłem sobie z Docker'em. Opierałem się na tym przykładzie: https://www.section.io/engineering-educatio...nt-environment/
Jednak mam problem. Mój instalator skryptu php, który piszę, wymaga zmiany uprawnień pliku konfiguracyjnego na 666. Pod Windows było ok. Pod Linux'em mam komunikat: Cytat Warning: chmod(): Operation not permitted in /var/www/html/install.php on line 19 Próbowałem zmieniać uprawnienia na root dla kontenerów Docker'a, ale to nie pomogło. Pewnie rozwiązanie mojego problemu jest proste, ale "raczkuję" w Linux'ie i nie potrafię sobie z tym poradzić... Jak prosto zrobić, aby mój skrypt php miał uprawnienia do zmiany zawartości własnych plików? Taki WordPress jakoś to robi... I jeszcze jedno pytanie odnośnie Cron'a. Znalazłem przykład, jak zaplanować wysyłkę e-mail'i z użyciem biblioteki ssh2: https://code.tutsplus.com/tutorials/managin...-php--net-19428 Da się to zrobić inaczej/lepiej bez użycia tej biblioteki? |
|
|
13.09.2022, 07:12:30
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Możliwe że właścicielem plików jest root, natomiast po stronie php-fpm będzie to 33:33 www-data:www-data (lub 82:82 na alpine). Jeśli tak, to nie będziesz mógł zmienić uprawnień. Pliki dostępne dla php zrób z odpowiednimi uprawnieniami dla usera:grupy php.
-------------------- |
|
|
13.09.2022, 19:25:00
Post
#8
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Nie wiem zbytnio, jak to zrobić, aby zadziałało. Dodałem w Dockerfile fragment kodu poniżej i dostaję komunikat, że nie ma takiego pliku/katalogu.
Kod RUN chown -R www-data:www-data /var/www/config/options.php
RUN chmod 666 /var/www/config/options.php |
|
|
14.09.2022, 05:55:24
Post
#9
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Więc pewnie nie ma tego pliku w chwili budowania.
-------------------- |
|
|
15.09.2022, 17:31:29
Post
#10
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Próbowałem również ustawić dostęp przy kopiowaniu i też nie zadziałało.
Kod COPY --chown=www-data:www-data . /var/www Jednak finalnie udało się z poziomu "Wiersza polecenia": Cytat docker exec -it php-apache bash cd /var/www/config ls -l chmod 666 /var/www/config/options.php chown -R www-data:www-data /var/www/config/options.php ls -l exit DODANE 15.09.2022: Ok. Umieszczam poniżej ustawienia Docker'a dla mojego projektu. Jeśli coś jest jeszcze nie tak, proszę o uwagi. Przetestowałem i działa dobrze. Tylko nie wiem, dlaczego po każdorazowym odpaleniu Docker'a tworzy mi się w katalogu aplikacji pusty folder "html". Nie powinien czasem istnieć/tworzyć się wyłącznie w kontenerze php-apache? ./README.md Kod # Go to the application directory cd <path to project> # Start the application stack defined in docker-compose.yml docker-compose up -d # Set the permissions and access for the php-apache container docker exec -it php-apache bash cd /var/www/config ls -l chmod 666 /var/www/config/options.php chown -R www-data:www-data /var/www/config/options.php ls -l exit # Stop the application stack docker-compose down ./docker-compose.yml Kod version: '3.8' services: php-apache-environment: container_name: php-apache build: context: ./docker/php dockerfile: Dockerfile depends_on: - db ports: - '8000:80' volumes: - .:/var/www - ./public:/var/www/html db: container_name: db image: mysql:8.0 restart: always environment: MYSQL_ALLOW_EMPTY_PASSWORD: true MYSQL_ROOT_PASSWORD: MYSQL_DATABASE: emailsender MYSQL_USER: emailsender MYSQL_PASSWORD: 1234567890 ports: - '9906:3306' phpmyadmin: container_name: pma image: phpmyadmin/phpmyadmin restart: always environment: PMA_HOST: db PMA_PORT: 3306 PMA_ARBITRARY: 1 depends_on: - db ports: - '8001:80' ./docker/php/Dockerfile Kod FROM php:8.0-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli && a2enmod rewrite RUN apt-get update && apt-get upgrade -y Ten post edytował eerie 15.09.2022, 17:39:57 |
|
|
16.09.2022, 06:12:09
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Masz jakieś pliki w ./public? (czyli bieżący folder w którym jest docker-compose.yml)
Trochę dziwnie wygląda podwójne montowanie tego samego. . pod /var/www i zaraz ponownie public. Ja bym przeniósł pliki projektu gdzieś poza konfigurację. -------------------- |
|
|
16.09.2022, 15:25:03
Post
#12
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
W ./public są tylko pliki, które mają być dostępne z poziomu przeglądarki. W głównym katalogu aplikacji są też foldery ./config, ./src, ./templates oraz pliki ./docker-compose.yml i ./README.md, do których przeglądarka nie ma mieć dostępu... A zaczęło się tak, iż ustawiłem "volumes" na "./public:/var/www/html" i przeglądarka znalazła mi główny plik index.php, ale wywaliło błędy przy includowaniu, iż nie widzi pozostałych plików. Poszukałem w Google i znalazłem przykład, na podstawie którego dodałem ".:/var/www". Od tej pory aplikacja działa poprawnie i nie wywala błędów przy dołączaniu plików (np. z folderu ./src) do głównego ./public/index.php. Jak wpisuję "http://localhost:8000" w przeglądarce, to widzi mi tylko pliki z ./public (/var/www/html w kontenerze php-apache). Nie znam się, ale może tak wolno, skoro znalazłem taki przykład w sieci i dobrze mi to działa...
PS Sprawdziłem jeszcze przed chwilą z ciekawości i kontener php-apache w /var/www zawiera zarówno katalog html oraz public. Obydwa z identyczną zawartością. Pliki w środku tych katalogów więc się dublują. |
|
|
16.09.2022, 15:28:30
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Traktuj swój folder jako jeden vhost. Zatem najlepiej rób taką strukturę żeby montując jeden folder hosta mieć wszystkie pliki projektu. Zapewne folder html jest w tym obrazie odczytywany jako główny punkt wejścia dla apache. Możesz sobie pewnie włączyć hosta w jakimś sites-enabled i wskaż mu wtedy że folderem odczytu jest public.
-------------------- |
|
|
27.09.2022, 18:35:45
Post
#14
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Zmieniłem
Kod volumes: - .:/var/www - ./public:/var/www/html na Kod volumes: - .:/var/www - ./docker/php/php-apache.conf:/etc/apache2/sites-enabled/000-default.conf i dodałem ./docker/php/php-apache.conf Kod <VirtualHost *:80> ServerAdmin admin@domain.com DocumentRoot "/var/www/public" ServerName php-apache </VirtualHost> i wszystko działa dobrze. PS Wzorowałem się na tym przykładzie: https://www.zehntech.com/quick-guide-to-imp...in-just-10-min/ DODANE 20.09.2022: Mam jeszcze małą wątpliwość. Gdy odpalam Docker'a, za każdym razem w katalogu projektu tworzy mi się pusty folder html. Zastanawiam się, czy nie poprawniej byłoby umieszczać wszystkie pliki strony nie w "/var/www", ale w "/var/www/html", jak jest w przykładzie z linka powyżej? Chyba że da się pozbyć tego folderu html w inny sposób... DODANE 26.09.2022: Poczytałem trochę i wygląda mi na to, iż główne foldery aplikacji php powinny być kopiowane jako podkatalogi /var/www (np. /var/www/1sitename, /var/www/2sitename). Ponieważ w moim projekcie mam w kontenerze tylko jedną stronę, to umieściłem ją domyślnie w /var/www/html. Do tego zauważyłem, że folder html ma dostęp dla www-data:www-data. Dlatego zrobiłem małe zmiany w kodzie i trochę inaczej kopiuję pliki, aby wszystkie miały te same uprawnienia (777 i www-data)... Nie wiem, czy to jest dobra praktyka, aby zmieniać wszystko z root na www-data? Teraz przynajmniej nie muszę nic robić z "Wiersza polecenia" poza wystartowaniem Docker'a. Prosiłbym o wszelkie uwagi i wątpliwości odnośnie prawidłowości kodu. ./docker-compose.yml Kod version: '3.9' services: php-apache-environment: container_name: php-apache build: context: . dockerfile: Dockerfile depends_on: - db ports: - '8000:80' volumes: - ./php-apache.conf:/etc/apache2/sites-enabled/000-default.conf [...] ./Dockerfile Kod FROM php:8.0-apache COPY --chown=www-data:www-data --chmod=777 . /var/www/html RUN a2enmod rewrite RUN apt-get update && apt-get install -y apt-transport-https RUN apt-get install -y libssh2-1-dev libssh2-1 \ && pecl install ssh2-1.3.1 \ && docker-php-ext-enable ssh2 RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli RUN apt-get update && apt-get upgrade -y ./php-apache.conf Kod <VirtualHost *:80> ServerAdmin admin@domain.com DocumentRoot "/var/www/html/public" ServerName php-apache </VirtualHost> Przeniosłem pliki Dockerfile i php-apache.conf do katalogu głównego aplikacji, bo miałem problem, że kopiowało mi do html w kontenerze tylko zawartość folderu ./docker/php. Nie udało mi się wyjść z niego przy kopiowaniu w stylu ./../../ czy jakoś tak... Nie wiem, jak to zrobić pod Linux'em... PS Musiałem dodać ponownie mapowanie "- .:/var/www/html" dla "volumes:" w pliku "docker-compose.yml". Bez tego zmiany w plikach nie są widoczne na bieżąco, a tylko stan z momentu kopiowania... Niestety dostęp powraca wtedy do root. Ten post edytował eerie 26.09.2022, 19:22:40 |
|
|
27.09.2022, 19:06:24
Post
#15
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Ale po co ty kopiujesz pliki do obrazu? Nie wrzucasz tego na produkcję tylko chcesz deva.
-------------------- |
|
|
29.09.2022, 19:11:06
Post
#16
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Faktycznie... Usunąłem COPY z Dockerfile i ponownie używam mapowania ".:/var/www/html".
Co do Cron'a. Znalazłem przykład: https://code.tutsplus.com/tutorials/managin...-php--net-19428 Tylko jest taki problem, że SSH2 służy do zdalnego korzystania z zasobów innej maszyny. Wątpię, aby firmy hostingowe na to pozwalały... Musiałbym chyba jakoś korzystać z Cron'a bezpośrednio z komputera, gdzie mam odpaloną moją aplikację i gdzie chcę wysyłać e-mail'e. I tu mam wątpliwość. Trzeba do tego mieć chyba specjalne uprawnienia, żeby korzystać z Cron'a? Nie wiem, czy firmy hostingowe na coś takiego pozwalają? Aplikacja ma docelowo działać nie na mojej maszynie, ale na zdalnym serwerze (usługa hostingowa). Prosiłbym o jakąś podpowiedź, jak to najprościej rozwiązać... |
|
|
30.09.2022, 08:46:51
Post
#17
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Nie znam firmy hostingowej która by nie dawała obsługi cron u siebie.
-------------------- |
|
|
3.10.2022, 19:31:39
Post
#18
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Prawie sobie poradziłem z zagadnieniem... Zamiast używać biblioteki SSH2, korzystam z funkcji exec() języka php. Tylko mam problem z odpaleniem kontenera php-apache z wystartowanym cron'em i php jednocześnie. Udaje mi się wystartować cron'a, jak w przykładzie poniżej, ale nie działa wtedy php. Jak usunę "CMD ["cron", "-f"]" z pliku Dockerfile, to działa php, ale cron'a muszę odpalić z wiersza polecenia. Nie udaje mi się odpalić jednego i drugiego jednocześnie. Jak to wygląda w plikach, podaję poniżej:
./Dockerfile Kod FROM php:8.0-apache RUN a2enmod rewrite RUN apt-get update && apt-get install -y cron RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli RUN apt-get update && apt-get upgrade -y CMD ["cron", "-f"] ./public/index.php Kod <?php if (exec('crontab crontab.txt >/dev/null 2>&1') !== false) { echo 'OK'; } else { echo 'BAD'; } ./public/run.php Kod <?php // Check on your command line: crontab -u www-data -l exec('crontab -r >/dev/null 2>&1'); ./public/crontab.txt Kod * * * * * /usr/local/bin/php /var/www/html/public/run.php >/dev/null 2>&1 PS Korzystałem tu z tych przydatnych stron: https://www.thesitewizard.com/general/set-cron-job.shtml https://www.looklinux.com/bash-crontab-command-not-found/ |
|
|
4.10.2022, 07:14:30
Post
#19
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
Dodaj sobie gdzieś plik crona
Kod SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * * www-data php /var/www/html/public/run.php >> /dev/null 2>&1 Następnie w dockerfile Kod ## CRON COPY ścieżka do tego pliku/cron.d/ /etc/cron.d/ RUN chmod 0544 /etc/cron.d/* && touch /var/log/cron.log && crontab /etc/cron.d/* I w pliku uruchomieniowym (jeśli jest w tym obrazie takie coś, zazwyczaj entrypoint.sh) Kod service cron start
-------------------- |
|
|
5.10.2022, 18:33:18
Post
#20
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 3.08.2017 Ostrzeżenie: (0%) |
Siedzę nad tym i nie mogę dojść, jak to powinno działać:
1. Zamierzałem zrobić tak, iż tworzę zadanie dla cron'a (crontab crontab.txt), gdy zaplanuję wysyłkę (przycisk "Send"). Gdy wysyłka się skończy, skrypt usuwa to zadanie (crontab -r). 2. Jednak zastanawiam się, czy nie powinno być tak, iż na starcie serwera jest uruchomione zadanie odpalania okresowo jakiegoś pliku php. W tym pliku sprawdzam, czy jest zaplanowana wysyłka. Jak jest, to wysyłam. Jak nie ma, to nie robię nic. I tak w kółko 24/7. Który wariant jest poprawny? Bo wydaje mi się, iż nie ma sensu ciągle sprawdzać, czy skrypt ma coś wysłać, gdy nic nie zaplanowałem do wysyłki... DODANE 05.10.2022: Przeanalizowałem jeszcze raz tamten przykład klasy, która korzysta z biblioteki SSH2. I na potrzeby mojej aplikacji to chyba optymalne rozwiązanie. Czyli np. w folderze ./config tworzę plik "crontab.txt". Na jego podstawie tworzę zadanie cron'a i kasuję ten plik. Gdy wysyłka e-mail'i dobiegnie końca, to usuwam moje zadanie cron'a... Ten przykład z "SHELL=..." i "PATH=..." (crontab.txt) nie chciał mi ruszyć, aż usunąłem "www-data". Po prostu coś nie chciało mi odpalić pliku "run.php", ale już działa. I udało mi się uruchomić cron'a i php jednocześnie. W pliku Dockerfile zamieniłem ostatnią linię na "CMD (cron -f -l 8 &) && apache2-foreground". I wszystko już działa. |
|
|
Wersja Lo-Fi | Aktualny czas: 23.04.2024 - 22:43 |