PHP et YAML

On a desfois besoin de manipuler du YAML en PHP mais le support n'est pas natif. Voyons comment ajouter la prise en charge, en lecture et écriture.

Dans le monde php il y a la bibliothèque native au langage, puis il y a les extensions communautaires hébergées dans le dépôt PECL (PHP Extension Community Library). L'extension yaml est distribuée via ce dépôt.

Le contexte est une machine sous MacOS, cpu Apple Silicon, avec le gestionnaire de paquet homebrew (le préfixe homebrew est différent suivant l'architecture).

Installation du module PECL

1brew install php libyaml
2pecl install yaml

Répondre /opt/homebrew/Cellar/libyaml/0.2.5 à la question sur où est installé libyaml (l'autodetect ne marche pas, adaptez le n° de version si besoin).

Si la compilation se déroule bien, le fichier créé est le suivant : /opt/homebrew/Cellar/php/8.4.3/pecl/20240924/yaml.so

L'installeur a la facheuse tendance de modifier le fichier /opt/homebrew/etc/php/8.4/php.ini et de le préfixer avec la ligne :

1extension=yaml.so

Ceci crée un warning au runtime et ne charge pas le module. Retirez cette ligne !

Créez d'autre part le fichier /opt/homebrew/etc/php/8.4/conf.d/ext-yaml.ini avec comme contenu :

1extension=/opt/homebrew/Cellar/php/8.4.3/pecl/20240924/yaml.so

Vérifier que l'extension est bien chargée :

1php -m | grep yaml
2yaml

Voilà, vous pouvez désormais accéder aux fonctions yaml_emit, yaml_emit_file, yaml_parse, yaml_parse_file et yaml_parse_url.

Installation de la dépendance composer

Une autre méthode, en pur php, est d'utiliser l'écosystème de composer et le module yaml développé par symfony. Ça a l'avantage de ne rien avoir à compiler !

Exécutez :

1composer require symfony/yaml

yaml d'exemple

 1global:
 2  name: "Le nom du preset"
 3tracks:
 4  - type: "video"
 5    pid: 101
 6  - type: "audio"
 7    pid: 201
 8  - type: "audio"
 9    pid: 202
10  - type: "audio"
11    pid: 203

Créez de test

 1<?php
 2
 3use Symfony\Component\Yaml\Yaml;
 4
 5require 'vendor/autoload.php';
 6
 7$value = Yaml::parse("foo: bar");
 8var_dump($value);
 9
10$value = Yaml::parseFile('file.yaml');
11var_dump($value);

Ce qui affichera

 1array(1) {
 2  ["foo"]=>
 3  string(3) "bar"
 4}
 5array(2) {
 6  ["global"]=>
 7  array(1) {
 8    ["name"]=>
 9    string(16) "Le nom du preset"
10  }
11  ["tracks"]=>
12  array(4) {
13    [0]=>
14    array(2) {
15      ["type"]=>
16      string(5) "video"
17      ["pid"]=>
18      int(101)
19    }
20    [1]=>
21    array(2) {
22      ["type"]=>
23      string(5) "audio"
24      ["pid"]=>
25      int(201)
26    }
27    [2]=>
28    array(2) {
29      ["type"]=>
30      string(5) "audio"
31      ["pid"]=>
32      int(202)
33    }
34    [3]=>
35    array(2) {
36      ["type"]=>
37      string(5) "audio"
38      ["pid"]=>
39      int(203)
40    }
41  }
42}

Ressources

comments powered by Disqus