Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Osobna baza dla każdej subdomeny + wildcard
Forum PHP.pl > Forum > PHP > Frameworki
misiek08
Witam!
Niedawno zacząłem pracę z ZF. Wcześniej pisałem albo w czystym PHP albo na gotowych klasach. To jednak zaczęło nudzić, bo każdy projekt wymagał kilku zmian, a ZF ma tyle klas, że wystarczy tylko odpowiednie ładować.

Teraz mój problem:
Mam system, który do tej pory używał osobnej bazy dla każdej subdomeny i dodatkowo korzysta z wildcard'a dla sudomen. Do tej pory miałem własnej roboty skrypt w PHP, który z głównej bazy czytał dane dla subdomeny i ładował resztę plików dla danej subdomeny. Przepisywanie .htaccess'em.
Widzę, że Zend ma klasę Router_Hostname, która rozwiązuje problem samych subdomen. Nie wiem teraz jak mam ładować ustawienia bazy danych. Dla 1 sudomeny wszystko działa, a jakoś nie uśmiecha mi się, żeby pisać skrypt, który wrzuci całego Zend'a do kolejnych katalogów i zmieni dane bazy, bo będzie to wymagało ogrmnej powierzchni przy większej ilości subdomen (teraz jest koło 100, więc 700MB by potrzeba dla projektu).

batman
Wybacz, że rzucę hasłami, ale nie mam teraz dostępu do serwera, w związku z czym nie mogę pokazać przykładowego kodu.

1. Korzystasz z routera Hostname, gdzie każda subdomena wskazuje na osobny moduł. Moduły to takie mini aplikacje w ZF.
2. Do baz wielu danych możesz skorzystać z zasobu aplikacji o nazwie multidb (Zend_Applicaion_Resource)
3. Ustawianie odpowiedniej bazy możesz zrobić w pliku Bootstrap każdego modułu lub w globalnym pluginie, który wykryje jaki jest bieżący moduł i podłączy odpowiednią bazę.

O modułach znajdziesz u mnie na blogu. Router Hostname będę opisywał niedługo winksmiley.jpg
misiek08
Do modułów jeszcze nie doszedłem. Na razie książka i podstawy + właśnie taki eskperyment.
zegarek84
Cytat(misiek08 @ 13.06.2010, 18:18:01 ) *
Teraz mój problem:
Mam system, który do tej pory używał osobnej bazy dla każdej subdomeny i dodatkowo korzysta z wildcard'a dla sudomen. Do tej pory miałem własnej roboty skrypt w PHP, który z głównej bazy czytał dane dla subdomeny i ładował resztę plików dla danej subdomeny. Przepisywanie .htaccess'em.
Widzę, że Zend ma klasę Router_Hostname, która rozwiązuje problem samych subdomen. Nie wiem teraz jak mam ładować ustawienia bazy danych. Dla 1 sudomeny wszystko działa, a jakoś nie uśmiecha mi się, żeby pisać skrypt, który wrzuci całego Zend'a do kolejnych katalogów i zmieni dane bazy, bo będzie to wymagało ogrmnej powierzchni przy większej ilości subdomen (teraz jest koło 100, więc 700MB by potrzeba dla projektu).
może na chwilę zapomnijmy o problemie i odwróćmy sytuację do:
  • mam wildcard'a na domenie
  • przepisuję adresy nie jawnie w .htaccess z subdomen na domenę główną i dopisuję dodatkowy parametr GET z subdomenami
  • mam domenę główną [zapominam już o subdomenach] i adres gdzie może wystąpić zmienna $_GET w której mam "subdomene"
  • pisze sobie sterownik bądź korzystam z gotowych gdzie na domenie głównej najważniejsze dane wejściowe zależą od parametru/zmiennej bądź jej braku $_GET określającej subdomenę [przy braku brak subdomeny]


więc problem został uproszczony do odpowiedniego wpisu w .htaccess i uzależnienia tego wszystkiego od jednej zmiennej gdzyz wszystko i tak masz przekierowane na tą domenę główną - a więc wszędzie ścieżki są takie same... WIĘC NIE JEST POTRZEBNA WIĘKSZA POWIERZCHNIA DYSKOWA...
misiek08
@zegarek84 - wszystko o czym piszesz to prawda, ale jest 1 zasadniczy problem. To wszystko mam napisane od ręki w "czystym" PHP. Teraz chcę to do Zend'a przenieść.

Może ktoś z jakimś przykładem? Problem polega na potrzebie ładowania innych ustawień bazy danych dla każdej subdomeny. Resztę już sobie opiszę w bazie i na kontrolerach.

EDIT:
Znalazłem już chyba rozwiązanie problemu.
http://jaybill.com/2007/09/12/using-the-ze...iple-databases/

Kod
$databases = new Zend_Config_Ini('./application/config.ini', 'databases');

Kod
$dbAdapter = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());


W czystym PHP napiszę sobie kod, który odczyta subdomenę i podstawi pod powyższy kod odpowiednie dane. Najgorsze jest to, że trzeba będzie zrobić połączenie z MySQL w czystym PHP, ale czego sie nie robi dla projektów.
zend
Czemu nie zrobisz tak jak napisał batman? Nie licząc tego, wszystko jest ok
Cytat
1. Korzystasz z routera Hostname, gdzie każda subdomena wskazuje na osobny moduł.

Moduły są te same, a w pluginie który podpinasz do Zend_Controller_Front ustawiasz z jakiej bazy chcesz korzystać i po problemie
Co do multiDb w application.ini miał bym wątpliwości, polecał bym stworzyć osobny plik z konfiguracjami bazy zależnymi od subdomeny, ładować przez Zend_Config i przekazywać jako parametr konstruktora pluginu
misiek08
Nie będzie multidb. Będę czystym PHP pobierał z głownej bazy dane dla subdomeny i wstawiał na zasadzie:
  1. $link = mysql_connect(.....);
  2. mysql_select_db('main', $link);
  3. $subdomena = strtolower(array_shift(explode('.', $_SERVER['HTTP_HOST'])));
  4. $wynik = mysql_query('..... = '. $subdomena, $link);
  5. $wynik = mysql_fetch_array($wynik);
  6. $dbAdapter = Zend_Db::factory('pdo_mysql', $wynik);
  7. mysql_close($link);


Nie znam tak bardzo modułów i Zend'a, żeby zrobić to po Twojemu. Może jakiś przykład albo kod do tego?
zend
  1. domena.password = 'xxx'
  2. domena.login = 'xxx'
  3. #itd


  1. //kod w botstrapie albo index'ie
  2. $c = new Zend_Config_Ini('bazy.ini');
  3. $plugin = new Databases($c);
  4. Zend_Controller_Front::getInstance() -> registerPlugin($plugin);


O pluginach przeczytasz tu
misiek08
A mój sposó zły? Trzymanie danych baz w plikach to raczej dla mnie nie jest najlepsze rozwiązanie, bo wolę jednak mieć wszystko w bazie.
zend
Twój projekt, Ty decydujesz smile.gif Rozwiązanie na bazie oszczędzi Ci trochę pamięci, bo jednak cały plik trzeba załadować
misiek08
Mi chodzi o taką elastyczność w pewnym sensie i jednolitość, ponieważ wszystkie dane chce trzymać w bazie i nic nie trzymać w plikach. Dziękuję za odpowiedź i za nakierowanie na mój własny pomysł.

Jak ktoś ma jakieś uwagi czy dodatkowe pytania do tego samego tematu, to można by ten topic podpiąć jako ciekawy temat. Jest trochę takich aplikacji wildcard'owych. Np. Wordpress MU
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.