Opcje, które widzę ze względnymi zaletami / słabościami, to:
Mechanizmy oparte na plikach
Wymagają one, aby kod przeszukiwał określone lokalizacje, aby znaleźć plik ini. Jest to trudny do rozwiązania problem, który zawsze pojawia się w dużych aplikacjach PHP. Jednak prawdopodobnie będziesz musiał rozwiązać problem, aby znaleźć kod PHP, który zostanie włączony / ponownie użyty w czasie wykonywania.
Typowe podejście to zawsze używanie katalogów względnych lub przeszukiwanie od bieżącego katalogu w górę w celu znalezienia pliku o nazwie wyłącznie w katalogu podstawowym aplikacji.
Typowe formaty plików używane w plikach konfiguracyjnych to kod PHP, pliki w formacie ini, JSON, XML, YAML i serializowane PHP
Kod PHP
Zapewnia to ogromną elastyczność w reprezentowaniu różnych struktur danych, a (zakładając, że jest przetwarzany za pomocą dołączania lub wymagania), przeanalizowany kod będzie dostępny z pamięci podręcznej kodu operacji - dając korzyść wydajności.
Metoda include_path umożliwia wyodrębnienie potencjalnych lokalizacji pliku bez polegania na dodatkowym kodzie.
Z drugiej strony jednym z głównych powodów oddzielenia konfiguracji od kodu jest oddzielenie obowiązków. Zapewnia trasę do wstrzykiwania dodatkowego kodu do środowiska wykonawczego.
Jeśli konfiguracja jest tworzona za pomocą narzędzia, może być możliwe sprawdzenie danych w narzędziu, ale nie ma standardowej funkcji ucieczki danych do osadzenia w kodzie PHP, jak ma to miejsce w przypadku HTML, adresów URL, instrukcji MySQL, poleceń powłoki ... .
Dane serializowane
Jest to stosunkowo wydajne w przypadku niewielkich ilości konfiguracji (do około 200 pozycji) i pozwala na użycie dowolnej struktury danych PHP. Tworzenie / analizowanie pliku danych wymaga bardzo niewielkiej ilości kodu (więc zamiast tego możesz poświęcić swoje wysiłki na upewnienie się, że plik jest zapisywany tylko z odpowiednią autoryzacją).
Ucieczka zawartości zapisanej do pliku jest obsługiwana automatycznie.
Ponieważ można serializować obiekty, stwarza to możliwość wywołania kodu po prostu przez odczytanie pliku konfiguracyjnego (magiczna metoda __wakeup).
Plik strukturalny
Przechowywanie go jako pliku INI, zgodnie z sugestią Marcela lub JSON lub XML, zapewnia również prosty interfejs API do mapowania pliku na strukturę danych PHP (z wyjątkiem XML, do ucieczki danych i tworzenia pliku), eliminując jednocześnie wywoływanie kodu podatność na zserializowane dane PHP.
Będzie miał podobną charakterystykę wydajności do serializowanych danych.
Przechowywanie bazy danych
Najlepiej jest to rozważyć, gdy masz dużą liczbę konfiguracji, ale jesteś selektywny w zakresie tego, co jest potrzebne do bieżącego zadania - byłem zaskoczony, gdy okazało się, że przy około 150 elementach danych szybsze było pobranie danych z lokalnej instancji MySQL niż odserializować plik danych.
OTOH to nie jest dobre miejsce do przechowywania danych logowania, których używasz do łączenia się z bazą danych!
Środowisko wykonawcze
Możesz ustawić wartości w środowisku wykonawczym, w którym działa PHP.
Eliminuje to wszelkie wymagania, aby kod PHP szukał w określonym miejscu konfiguracji. OTOH nie skaluje się dobrze do dużych ilości danych i trudno jest go uniwersalnie zmienić w czasie wykonywania.
Na kliencie
Jedno miejsce, o którym nie wspomniałem do przechowywania danych konfiguracyjnych, znajduje się u klienta. Ponownie narzut sieci oznacza, że nie jest to dobrze skalowalne do dużych ilości konfiguracji. A ponieważ użytkownik końcowy ma kontrolę nad danymi, muszą one być przechowywane w formacie, w którym można wykryć wszelkie manipulacje (tj. Za pomocą podpisu kryptograficznego) i nie powinny zawierać żadnych informacji, które zostałyby naruszone w wyniku ich ujawnienia (tj. Odwracalnie zaszyfrowane).
Z drugiej strony ma to wiele zalet w przypadku przechowywania poufnych informacji, które są własnością użytkownika końcowego - jeśli nie przechowujesz ich na serwerze, nie można ich stamtąd ukraść.
Katalogi sieciowe
Innym interesującym miejscem do przechowywania informacji konfiguracyjnych jest DNS / LDAP. To zadziała w przypadku niewielkiej liczby małych informacji - ale nie musisz trzymać się pierwszej normalnej formy - weź pod uwagę na przykład SPF .
Infrastruktura obsługuje buforowanie, replikację i dystrybucję. Dlatego sprawdza się dobrze w bardzo dużych infrastrukturach.
Systemy kontroli wersji
Konfiguracja, podobnie jak kod, powinna być zarządzana i kontrolowana wersjami - stąd uzyskanie konfiguracji bezpośrednio z systemu VC jest realnym rozwiązaniem. Ale często wiąże się to ze znacznym narzutem wydajności, dlatego buforowanie może być zalecane.