Rozszerzamy serwer - MySQL
Czym jest aplikacja która nie może przechowywać danych
Jakiś czas temu zrobiłem pierwszy odcinek kursu PHP w Praktyce w którym to pokazałem jak zrobić własny lokalny serwer na którym możecie budować aplikacje z użyciem PHP. Sensownie jest rozpocząć taki kurs od narzędzia umożliwiającego uruchamianie wszystkiego tego o czym będzie w dalszych odcinkach. Żeby uprościć sprawę na tak zwanego maksa a dodatkowo jeszcze wprowadzać dobre standardy zamiast udostępnić serwer do pobrania z własnej strony stworzyłem repozytorium wpraktyce/server
z które to można sobie pobrać zrobić fork. Oczywiście projekt był prosty adekwatnie do potrzeb kursu. Co prawda kurs nie doczekał się jeszcze odcinka w którym potrzebowalibyśmy baz danych jednak chcąc sobie odświeżyć trochę wiedzę z zakresu bash
postanowiłem rozszerzyć trochę funkcjonalność tego serwera. Co opisze w tym poście.
Oryginalny odcinek kursu można znaleźć tutaj: Lokalny Server PHP.
Obsługa błędów
Najpierw jednak muszę się przyznać do pewnego przeoczenia, mógłbym wręcz powiedzieć, że błędu. Zapomniałem prawidłowo skonfigurować wyświetlanie błędów więc bardzo trudne było rozwiązywanie jakichkolwiek pomyłek w kodzie PHP. Zamiast czytelnego błędu wyświetlała nam się pusta strona ponieważ serwer był w konfiguracji produkcyjnej. Oczywiście wystarczyło zajrzeć do notatek sprzed lat i wprowadzić kilka dodatkowych linijek do naszego skryptu. Przede wszystkim chodziło o włączenie następujących dyrektyw:
display_errors = On
error_reporting = E_ALL
Zrobiłem to z użyciem komendy sed
całość zmian znajdziecie tutaj: 72b2fd5
Reorganizacja skryptu
Jako kolejny element ulepszeń postanowiłem podzielić skrypt który znajduje się w jednym pliku na funkcje zajmujące się poszczególnymi sekcjami naszego serwera. Skrypt lada moment będzie rozszerzony o kolejne n linijek odpowiedzialnych za serwer bazy danych, jego konfigurację i użytkowników, czyli moment wprowadzenia modułowości jest idealny. Pozwoli nam to łatwiej zarządzać wszystkim w przyszłości.
Stworzyłem folder src
w którym będę przechowywał funkcje bash
. Oczywiście pierwszym krokiem musi być załadowanie tych wszystkich funkcji do naszego głównego skryptu, jeśli wszystkie interesujące nas funkcje znajdują się w jednym katalogu i są tam tylko pliki z funkcjami możemy to zrobić za pomocą jednej pętli:
for THIS_FILE in src/*
do
source $THIS_FILE
done
Jeśli w przyszłości potrzebowalibyśmy dodać jakiś plik z innej lokalizacji możemy to zrobić z użyciem komendy source
podając ścieżkę do tego pliku. Funkcje definiujemy bardzo prosto bo:
function nazwa_funkcji()
{
# kod funkcji
}
Uwaga! Należy pamiętać żeby wszystkie kody umieścić w funkcjach dzięki czemu wykonają się one dopiero w momencie wywołania przez nas funkcji, ze wszystkimi wymaganymi parametrami. W przeciwnym wypadku skrypty wykonają się w momencie ich załadowania.
Następnie należy już tylko w odpowiedniej kolejności wywołać nasze funkcje:
base_setup
install_apache
install_composer
Całość zmian znajdziecie tutaj: 512cad3
MySQL
Przejdźmy do właściwego tematu tego wpisu, chcemy dodać zarówno sam serwer MySQL jak i jego obsługę w PHP, więc zacznijmy od tego pierwszego. W tym celu dodałem jedną dodatkową bibliotekę php5-mysql
do skryptu install_apache
instalującego nam PHP. Podstawowa instalacja PHP wygląda teraz tak:
apt-get -y install php5 php5-mysql
Kolejnym krokiem jest instalacja samego serwera, jako że to zadanie jest dość duże samo w sobie stworzyłem mu osobną funkcję install_mysql
. W skrócie funkcja instaluje nam sam serwer oraz przeprowadza podstawową konfigurację taką jak:
- ustawienie hasła dla użytkownika
root
które można podać jako pierwszy parametr funkcji - umożliwienie dostępu publicznego do bazy
- kopiujemy domyślny plik konfiguracji
local.cnf
- utworzenie pierwszej bazy danych której nazwa może być opcjonalnie ustawiona jako drugi parametr
Dodawanie użytkowników
Kolejnym krokiem będzie dodanie użytkownika którego będziemy używać do połączenia z naszą bazą danych, w tym celu stworzyłem funkcję mysql_add_user
. Pierwszym parametrem jest nazwa użytkownika drugim jego hasło. Funkcja nie tylko dodaje użytkownika ale również przyznaje mu wszystkie uprawnienia do tej bazy danych. W skrypcie domyślnie dodajemy jednego użytkownika na start.
mysql_add_user user pass [root_pass] [db_name]
Konfiguracja połączenia
Teraz pozostało nam tylko użyć klienta MySQL żeby połączyć się z naszą bazą danych. Ja osobiście używam Sequel Pro jeśli chodzi o coś na inne platformy to MySQL Workbench lub pobawić się w instalację webowego phpMyAdmin. Bez różnicy jakiego klienta użyjemy nasze dane do logowania na początek będą takie:
Host | 172.11.1.111 |
---|---|
User | user |
Password | pass |
Database | develop |
Port | 3306 |
Zmiany w kodzie możecie oczwyiście znaleźć tutaj: 175c0a5
Konfiguracja
Oczywiście opisanie wszystkiego dokładnie zajęło by mi znacznie więcej czasu. Myślę, że wyjaśniłem najważniejsze elementy teraz czas na ostatni konfigurację modułów. Obecnie komenda vagrant up
zainstaluje nam wszystko zarówno PHP jak i MySQL ale nie zawsze jest nam potrzebna pełna konfiguracja. Wygląda to tak:
base_setup
## Configuration:
install_apache
install_composer
install_mysql
mysql_add_user user pass
install_tools
Jeśli któryś z elementów nie będzie nam potrzebny wystarczy daną linijkę zakomentować używając #
. Oczywiście nie polecam usuwania base_setup
. Dla przykładu jeśli nie chcemy instalować bazy danych:
base_setup
## Configuration:
install_apache
install_composer
install_mysql
# mysql_add_user user pass
# install_tools
Cały pull request dostępny jest tutaj PR#1.
Inne dostępne narzędzia
Ważne jest to żeby wspomnieć o tym, że w przypadku serwerów PHP istnieją również inne gotowe narzędzia. Bo czy tworząc ten mały projekt nie powieliłem już istniejących dobrze wspieranych projektów? Oczywiście, że tak! Ale zrobiłem to w celach edukacyjnych, łatwiej zrozumieć działanie pewnych rzeczy na prostszych przykładach. Jeśli chodzi o użytkowanie komercyjne to oczywiście polecam użycie bardziej profesjonalnych narzędzi.
Tak jak już wspominałem od tych bardziej ogólnych przechodzimy do tych bardziej wyspecjalizowanych. VirtualBox jest ogólnie platformą do tworzenia maszyn wirtualnych, Vagrant wspomaga automatyczne i powtarzalne tworzenie maszyn wirtualnych a Homestead zbiera to wszystko razem do kupy i tworzy nam gotowe do działania środowisko PHP przystosowane do współpracy z framework’iem Laravel. Jest to oczywiście narzędzie znacznie bardziej rozbudowane od przedstawionego przeze mnie serwera i jeśli interesuje nas tylko korzystanie to czemu nie użyć czegoś co w szybki sposób pozwala nam stworzyć wiele lokalnych stron.
Innym rozwiązaniem o którym tutaj tylko wspomnę jest Docker czyli inny rodzaj wirtualizacji. Można go określić liderem przyszłości a dokładniejsze opisy zostawię specjalistom z dziedziny.
Co dalej?
Jeśli chodzi o następne etapy to:
- koniecznie trzeba przenieść serwer na PHP7
- wprowadzić obsługę SQLite oraz MongoDB żeby poszerzyć możliwości edukacyjne, ale to też może dopiero z odcinkami kursu
- może zmiana architektury w celu łatwiejszego importowania serwera do innych projektów lub lepszy mechanizm do zarządzania
vhost
z różnych lokalizacji
Wersja do której się odnosi ten wpis to v2.0.0
- Category:
- Development