YAML – techniczny przegląd formatu konfiguracji
YAML (YAML Ain't Markup Language) to lekki, czytelny dla człowieka format serializacji danych, który jest często stosowany do konfiguracji aplikacji i wymiany danych między systemami. Zaprojektowany z myślą o prostocie i przejrzystości, YAML zyskał popularność w wielu środowiskach programistycznych, w tym w DevOps, infrastrukturze jako kod (IaC), oraz frameworkach webowych.
Cechy charakterystyczne YAML
- Czytelność: YAML ma składnię zbliżoną do struktury naturalnego języka (angielskiego), bazuje głównie na wcięciach, co sprawia, że jest bardziej przejrzysty niż JSON lub XML.
- Bez typowych nawiasów: YAML nie używa znaków takich jak
{}
,[]
, które są typowe dla JSON-a, co poprawia czytelność. - Wieloliniowe teksty: YAML wspiera wiele sposobów zapisu danych tekstowych, w tym teksty wieloliniowe (
|
,>
). - Obsługa aliasów i kotwic: YAML pozwala na używanie referencji (
&
,*
) co ułatwia unikanie duplikacji danych.
Przykład pliku YAML
database:
host: localhost
port: 3306
user: root
password: secret
features:
logging: true
cache:
enabled: true
ttl: 3600
Zalety YAML
- Czytelność i prostota – idealny do konfiguracji pisanej i czytanej przez ludzi.
- Hierarchiczna struktura – naturalne odwzorowanie zagnieżdżonych danych.
- Wieloplatformowość – obsługiwany przez wiele języków i narzędzi.
- Rozszerzalność – wsparcie dla niestandardowych typów danych przez tagi.
Wady YAML
- Brak formalnego standardu – mimo istnienia specyfikacji, różne parsery mogą interpretować YAML inaczej.
- Wrażliwość na wcięcia – błędy w strukturze mogą być trudne do wykrycia.
- Brak typów jawnych – YAML domyślnie nie określa typów, co może prowadzić do nieoczekiwanych konwersji (np.
no
jakofalse
). - Problemy z bezpieczeństwem – niektóre parsery YAML (np. w Pythonie:
yaml.load
) są podatne na ataki typu arbitrary code execution, jeśli użyte są niebezpieczne źródła.
Zastosowania YAML
- Pliki konfiguracyjne: np. w Kubernetes (
deployment.yaml
), Docker Compose (docker-compose.yaml
), Ansible, GitHub Actions (.github/workflows/*.yml
). - Definicje struktur danych: np. w OpenAPI/Swagger, CI/CD.
- Infrastruktura jako kod: np. w Terraform (częściowo), CloudFormation (YAML zamiast JSON).
Porównanie YAML z innymi formatami konfiguracji
Format | Czytelność | Wsparcie dla zagnieżdżeń | Typowanie | Bezpieczeństwo | Parsowanie | Popularność |
---|---|---|---|---|---|---|
YAML | Wysoka | Tak | Słabe | Zależy od parsera | Średnie | Wysoka (DevOps) |
JSON | Średnia | Tak | Dobre | Wysokie | Bardzo szybkie | Bardzo wysoka |
XML | Niska | Tak | Dobre | Wysokie | Wolniejsze | Niska (obecnie) |
TOML | Wysoka | Ograniczona | Dobre | Wysokie | Szybkie | Średnia (Rust, Python) |
INI | Wysoka | Ograniczona | Słabe | Średnie | Szybkie | Umiarkowana |
PHP array | Średnia | Tak | Dobre (jawne) | Wysokie | Bardzo szybkie (natywnie w PHP) | Wysoka (projekty PHP) |
Użycie YAML w PHP z biblioteką Spyc
Spyc to lekka, jedno-plikowa biblioteka do parsowania YAML w PHP. Nie wymaga rozszerzeń, ani instalacji przez Composer (choć może być używana i w taki sposób). Idealna dla małych projektów.
Instalacja
Najprościej: pobierz plik spyc.php
ze strony projektu (np. z https://github.com/mustangostang/spyc) i załaduj:
require_once 'spyc.php';
Przykład użycia
Przykładowy plik konfiguracyjny config.yaml
:
app:
name: MyApp
debug: true
database:
host: localhost
port: 3306
username: root
password: secret
Wczytanie YAML do tablicy PHP:
require_once 'spyc.php';
$config = Spyc::YAMLLoad('config.yaml');
echo $config['app']['name']; // MyApp
echo $config['database']['host']; // localhost
Konwersja tablicy PHP do YAML:
$data = [
'app' => [
'name' => 'AnotherApp',
'debug' => false,
],
];
$yamlString = Spyc::YAMLDump($data);
echo $yamlString;
Porównanie Spyc z innymi bibliotekami YAML w PHP
Biblioteka | Waga / złożoność | Sposób instalacji | Wydajność | Zgodność ze specyfikacją YAML | Obsługa funkcji YAML (kotwice, typy, itd.) | Uwagi |
---|---|---|---|---|---|---|
Spyc | Lekka, 1 plik | ręczna / git / Composer | Dobra | YAML 1.1 | Ograniczona (brak wsparcia dla aliasów) | Prosty parser, wystarczający do 90% użyć |
Symfony YAML | Średnia | composer require symfony/yaml |
Bardzo dobra | YAML 1.2 częściowo | Dobra (aliasy, typy, wyjątki) | Bardzo popularna, dobrze utrzymywana |
ext-yaml (PECL) | Wysoka (C) | pecl install yaml |
Najszybsza | YAML 1.1 | Bardzo dobra | Wymaga PECL i C-ext – nie zawsze dostępna |
yaml-php/yaml | Lekka / śr. | composer require yaml/yaml |
Średnia | YAML 1.2 częściowo | Podobna do Symfony | Mało aktywna, ale działa poprawnie |
Kiedy warto wybrać Spyc?
- Potrzebujesz lekkości i braku zależności (np. do małego projektu, CLI, pluginu).
- Chcesz po prostu sparsować YAML do tablicy PHP.
- Nie potrzebujesz wsparcia dla zaawansowanych funkcji YAML jak kotwice (
&
,*
) czy tagi typów (!!str
).
Porównanie formatów YAML, PHP, XML i JSON
Oto porównanie tego samego pliku konfiguracyjnego w czterech formatach: YAML, PHP array, XML i JSON. Po przykładach podsumujemy zalety YAML, ale też pokażemy, dlaczego PHP array często bywa bardziej praktyczny w kontekście projektów PHP.
1. YAML (config.yaml
)
app:
name: MyApp
debug: true
database:
host: localhost
port: 3306
username: root
password: secret
Zalety:
- Bardzo czytelny i zwięzły.
- Przypomina strukturę języka naturalnego.
- Idealny dla DevOps, sysadminów, CI/CD.
Wady:
- Wrażliwy na wcięcia (łatwo popełnić błąd).
- Wymaga parsera.
- Brak logiki (np. brak
env()
lubif()
).
2. PHP (config.php
)
<?php
return [
'app' => [
'name' => 'MyApp',
'debug' => true,
],
'database' => [
'host' => 'localhost',
'port' => 3306,
'username' => 'root',
'password' => 'secret',
],
];
Zalety:
- Natywny dla PHP – nie wymaga parsera.
- Wysoka wydajność (
include
/require
). -
Możliwość dynamicznej logiki:
'debug' => getenv('APP_DEBUG') === 'true',
Wady:
- Mniej przyjazny wizualnie.
- Mało zrozumiały dla osób nie znających PHP.
3. XML (config.xml
)
<config>
<app>
<name>MyApp</name>
<debug>true</debug>
</app>
<database>
<host>localhost</host>
<port>3306</port>
<username>root</username>
<password>secret</password>
</database>
</config>
Zalety:
- Formalny, dobrze wspierany standard.
- Walidowalny przez XSD/DTD.
Wady:
- Najmniej czytelny z formatów.
- Bardzo rozwlekły.
- Nieintuicyjna składnia, trudna ręczna edycja.
4. JSON (config.json
)
{
"app": {
"name": "MyApp",
"debug": true
},
"database": {
"host": "localhost",
"port": 3306,
"username": "root",
"password": "secret"
}
}
Zalety:
- Popularny, dobrze wspierany przez języki.
- Łatwo serializować i deserializować.
Wady:
- Brak komentarzy (to częsty problem).
- Dla większych plików traci czytelność.
Podsumowanie: YAML vs PHP
Cecha | YAML | PHP array |
---|---|---|
Czytelność | (ludzka, zwięzła) | |
Natywność w PHP | wymaga parsera | tak |
Obsługa logiki | brak | pełna (env, if, itp.) |
Błędy składniowe | wcięcia mogą sprawiać problemy | szybciej wykrywane |
Wydajność | Średnia (parsowanie tekstu) | Bardzo wysoka (include ) |
Zrozumiałość dla nietechnicznych | często tak | często nie |
Wnioski
YAML jest potężnym i elastycznym formatem konfiguracji, który dzięki swojej czytelności świetnie sprawdza się w projektach DevOps, CI/CD oraz aplikacjach wieloplatformowych. Jednak jego złożoność składniowa i potencjalne problemy bezpieczeństwa wymagają ostrożnego stosowania, zwłaszcza w aplikacjach o wysokich wymaganiach niezawodności. W środowiskach PHP, natywne pliki konfiguracyjne z użyciem tablicy mogą być wydajniejszą alternatywą, zwłaszcza w sytuacjach, gdzie ważna jest możliwość dynamicznego sterowania konfiguracją.
- YAML świetnie sprawdza się tam, gdzie konfigurację edytują osoby nietechniczne, DevOpsi lub pliki są częścią infrastruktury (np. Kubernetes, CI/CD).
- PHP array to najpraktyczniejszy wybór w projektach PHP, gdzie:
- liczy się wydajność i prostota,
- potrzebna jest logika (np. zmienne środowiskowe),
- chcemy uniknąć zależności (parserów YAML).
- Spyc to dobra opcja, jeśli cenisz prostotę i brak zależności.
- Symfony YAML sprawdzi się w większych projektach (np. z Symfony, Laravel – choć Laravel używa własnego wrappera).
- PECL ext-yaml to najszybsze, ale wymaga dodatkowego rozszerzenia serwera.
Zapoznaj się z moją aplikacją do testowania YAML:
http://www.dariuszrorat.ugu.pl/aplikacje/yaml-tester