Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Jeden CMS - wiele baz danych
Forum PHP.pl > Forum > Przedszkole
Kużdo
Witam,

Projektuję CMSa do zarządzania serwerem pewnej gry. Problem polega na tym, że taki serwer najczęściej posiada kilka odrębnych maszyn na kilka pewnych usług. Zazwyczaj są to dwie lub trzy maszyny dedykowane + serwer dla www, forum, komunikatora aka TS3, panelu graczy/zarządzania serwerem itp. I w taim przypadku na "maszynie www" znajduje się jedna baza danych, na "maszynie nr1" znajduje się druga baza danych, a na "maszynie nr2" znajduje się trzecia baza danych.

Do tej pory robiłem wszystko na stałe, więc było w miarę łatwo. Oczywiście przy każdym połączeniu musiałem wywoływać nowe połączenie SQL, bo innego wyjścia nie ma/nie znam. W tej chwili chciałem przepisać CMSa tak, żeby wszystkie adresy można było łatwo ustawiać z poziomu CMSa. Czyli instalacja (jeżeli jakakolwiek będzie) CMSa polegałaby na podaniu danych do bazy na której miałby się znaleźć CMS (czyli najprawdopodobniej baza z www, forum, itp.). Resztę konfigurowałoby się z poziomu już samego CMSa. Możliwość wpisania adresu IP serwera, loginu, hasła, nazwy bazy, prefisku (o ile będzie), to wszystko jest proste dla mnie do napisania w CMSie. Za to nie mam żadnego pomysłu jak rozwiązać łączenie się z danymi serwerami.

Wiadomo - dane pobierane z bazy i podstawiane zmienne. Pytanie, jak to napisać, żeby to było sprawne, szybkie i bezpieczne... Programowanie obiektowe odpada, bo nie umiem go jeszcze i jakoś nie spieszy mi się do jego uczenia, aczkolwiek jeśli są jakieś skrypty, które mógłbym przejrzeć w celu podpatrzenia jak to można byłoby ugryźć, to chętnie poczytam... Chciałbym, żebyście mi pomogli określić jak za to mniej więcej się zabrać... Chciałem utworzyć jakieś funkcje do łączenia się z bazą, wysyłania zapytań, itp. ale nie mam wizji jak one mogłyby wyglądać (nie zrozumcie mnie źle, wiem jak napisać takie funkcje do zwykłych CMSów z jedną bazą - nie mam wizji do tego projektu akurat, albo po prostu nie wpadłem jeszcze na ten prosty lecz genialny pomysł)...

Z góry dziękuję za każdą wartościową odpowiedź.
Pozdrawiam
Mephistofeles
Cóż, najprościej byłoby użyć jakiegoś frameworka, albo chociaż stosownych wzorców projektowych i zaprojektować system obiektowy. Nie rozumiem dlaczego odwlekasz naukę OOP, to naprawdę nie jest trudne, a nawet całkiem intuicyjne.

Nie bardzo rozumiem co chcesz zmieniać z poziomu tego CMSa... Poczytaj o ORMach takich jak Doctrine, one sporo ułatwiają pracę z wieloma połączeniami na raz. Ale jeśli tylko potrzebujesz wybrać jedno połączenie, to tutaj w zasadzie nic się nie różni od "zwykłego" jak to określasz systemu z jedną bazą.
Kużdo
W sumie nie wiem czy OOP mi się w tym projekcie przyda, a wychodzę z założenia, że OOP powinno się stosować tam, gdzie nie do końca wiemy jak admin będzie korzystał z CMSa. Dodatkowo wiem, że skrypty w OOP o wiele bardziej obciążają serwer niż skrypty strukturalnie pisane. No i stosuje się OOP tam, gdzie wiemy, że będziemy często rozwijać funkcjonalność projektu.

U siebie już z góry wiem co ma robić CMS i czego nigdy nie będzie robił... Więc jakiekolwiek zmiany będą polegały raczej na poprawie kodu na lepszy, szybszy, bezpieczniejszy, etc...

Odnośnie tematu - co byś polecił? Jakiego frameworka, który ma możliwość obsługi kilku baz danych na raz (tutaj ważny szczegół! Skrypt nie będzie odwoływał się tylko do jednej bazy w jednym wywołaniu, lecz może odwoływać się nawet do wszystkich zarejestrowanych baz!) lub jaki wzorzec projektowy?

----
Nie zdążyłem wysłać zanim zmieniłeś posta.

Co chcę zmieniać za pomocą CMSa? Dosłownie wszystko. Od zmian nazw postaci i ich właściwości po modyfikację lokacji, zarządzanie całymi grupami klanów, przedmiotów, etc... Skrypt też realizuje funkcję guarda, który pilnuje i automatycznie informuje administratorów gdy na serwerze dzieje się coś dziwnego (nagle ktoś zyskał skądś dużą ilość "czegoś" - i nie od innego gracza, tylko np. z jakiegoś buga).
Mephistofeles
OOP wcale tak bardzo nie obciąża serwera w porównaniu do programowania strukturalnego, a zysk z przejrzystości kodu i łatwości modyfikacji jest większy smile.gif.
Polecam przede wszystkim symfony, ale głównie dlatego, że sam na tym piszę. Są oczywiście inne frameworki, takie jak Kohana czy Zend. Zobacz sobie tutorial Jobeet, nie trzeba za dużo umieć żeby zrozumieć.

To co nazywasz guardem rozwiązałbym na bazie eventów, tak żeby odpowiednia klasa nasłuchiwała np. dodawania złota, w przypadku gdy przyrost będzie zbyt duży loguje zdarzenie jako podejrzane.
Zmianę wszystkiego ułatwia ORM (w tej roli Doctrine, albo Propel), bo pozwala łatwo odwzorować strukturę bazy na obiektach, dzięki czemu w prosty sposób dostaniesz się do np. graczy z danego klanu, bez potrzeby zadręczania się odpowiednimi zapytaniami i ich przetwarzaniem.

Aa, zapomniałbym. Doctrine czy Propel mają wbudowaną obsługę wielu połączeń, wystarczy ustawić połączenie z którego model ma korzystać podczas zapisu/odczytu, w ten sposób też można zrobić system master-slave.
Kużdo
Hmm czyli jednak będę musiał się zainteresować OOP... Trochę mi to nie pasuje, bo wolałbym zacząć już pisać skrypt niż dopiero studiować inne frameworki, no ale cóż... Myślałem, że będzie jakiś łatwy sposób na rozwiązanie problemu w strukturalnym php...

Będę musiał się poważnie zastanowić nad tym jak to rozwiązać...

(Przepraszam za post pod postem.)

Jednak chyba będę potrzebował pomocy. Nie chcę stosować całego frameworka do budowy mojego CMSa, bo nie jestem na to jeszcze przygotowany i potrzebuję jedynie jakąś sensowną obsługę wielu baz danych naraz, np. odpowiednie klasy czy funkcje, ewentualnie nakierowanie na to jak to ugryźć...

Do tej pory korzystałem z takiego pliku db.php > http://wklej.to/UvUu i wywołań zapytań z odpowiednim linkiem, czyli np.:
  1. <?php
  2. $db = "TUTAJ ZAPYTANIE";
  3. $db = db_query($db, $link_cms);
  4. ?>
Mephistofeles
Przede wszystkim wykorzystaj PDO, interfejs mysql_ jest naprawdę stary i zawiera luki (może nie tyle luki, co sprawia więcej trudności przy zabezpieczaniu). Do tego oczywiście używaj zapytań z podpinanymi parametrami.
Nie przechowuj połączeń w zmiennych, a w tablicy, dostęp przy późniejszym dodaniu nowego serwera będzie łatwiejszy.
Natomiast co do ORMów, nie musisz wykorzystywać jakiegoś fw żeby z nich korzystać, możesz podpiąć je pod swoje rozwiązanie. Poczytaj dokumentację Doctrine czy Propela, obsługa bazy z takim narzędziem jest łatwiejsza.
Kużdo
Przestudiowałem początki dokumentacji (m.in o połączeniach, zmian połączeń i wykonywania poleceń) ale coś nie wychodziło mi... Dodatkowo, nie wiem czy słusznie, ale mam wrażenie, że jeżeli załączę Doctrine przez:
  1. require_once(dirname(__FILE__) . '/doctrine/Doctrine.php');
  2. spl_autoload_register(array('Doctrine', 'autoload'));
  3. $manager = Doctrine_Manager::getInstance();

to załączę go całego... Czy wtedy nie zostanie wczytanych za dużo nie potrzebnych dla mnie klas itp.? Najlepszym dla mnie rozwiązaniem (przynajmniej tak mi się zdaje) byłoby "wycięcie" klas i metod do łączenia się z bazą danych, tak żebym mógł to po prostu zaimplementować w swoim CMSie bez angażowania w tym całego Doctrine... Obecny "poziom wtajemniczenia" nie pozwala mi niestety na pisanie aplikacji w OOP, a CMS jest potrzebny cały czas...
Crozin
Jeżeli zajrzałbyś do manuala PHP to zobaczyłbyś jaki jest drugi parametr dla funkcji mysql_query. Jest to identyfikator połączenia czyli innymi słowy dla której bazy danych ma być wykonane to zapytanie.

  1. $connections = array();
  2.  
  3. $connections['strona www'] = mysql_connect(....);
  4. mysql_query('USE nazwa bazy danych;', $connections['strona www']);
  5.  
  6. $connections['serwer gry #1'] = mysql_connect(....);
  7. mysql_query('USE nazwa bazy danych;', $connections['serwer gry #1']);
  8.  
  9. $connections['serwer gry #2'] = mysql_connect(....);
  10. mysql_query('USE nazwa bazy danych;', $connections['serwer gry #2']);
  11.  
  12. // Chcąc wywołać zapytanie dla bazy danych ze stroną WWW
  13. $rs = mysql_query('SELECT ... FROM ...;', $connections['strona www']);
  14. $data = mysql_fetch_assoc($rs);


OOP to paradygmat programowania i nie ma on nic wspólnego z tym jakie problemy będą rozwiązywane w programie. Można bez problemu napisać program, który będzie elastyczny, łatwy w rozbudowie, bezpieczny itp. itd. wykorzystując paradygmat programowania obiektowego/aspektowego/funkcyjnego/strukturalnego/proceduralnego/czy jeszcze jakiś innych. Sam paradygmat nie ma kompletnie nic do tego.

OOP jest czasami szybsze, czasami wolniejsze od kodu strukturalnego. Jednak śladowe różnice w szybkości są niezwykle rzadko priorytetem. W 99% programów jest to problem trzecio czy nawet czwartorzędny.


Jeżeli nie masz żadnego pojęcia dot. OOP - daruj je sobie w tym projekcie. Paradygmat ten jest bardzo prosty, ale mając umysł "skażony" (bardzo złe określenie) strukturalnym podejściem (złe, ponieważ programowanie strukturalne nie jest złe) będziesz najprawdopodobniej pisać kod, który z OOP nie ma nic wspólnego.

Cytat
to załączę go całego...
Nie, wczytana zostanie tylko niezbędna część, tj. ta która po prostu została użyta.
Dodatkowo pierwsze co powinieneś zrobić to upewnić się, że masz na serwerze zainstalowane APC, które pozwoli raz wczytać plik PHP do pamięci i trzymać go tam w postaci bytecode-u, dzięki czemu nie będzie potrzeby wczytywania pliku i jego parsowania przy każdym żądaniu.
Kużdo
Wydaje mi się, że nie do końca czytałeś moje posty. Ja wiem jak operuje się na wielu bazach ze zwykłym PHP i zwykłymi funkcjami mysql_query.
Crozin
Tak więc w czym masz problem? To czy użyjesz mysql_*, mysqli czy PDO nie ma znaczenia - będziesz musiał utworzyć tablicę zawierającą jakieś tam identyfikatory połączenia (strona www, serwer gry #1 itd) oraz same połączenia.
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-2025 Invision Power Services, Inc.