Coin web de Frédéric Péters

fpeters@0d.be

Où j’écris du PHP (un peu)

16 décembre 2020, 09:00

Du neuf récemment à la radio avec l’installation d’un système de forum. Ah ah du neuf alors qu’écrire «â€¯forum » me ramène fin années 90. Ne resterait plus qu’à noter que c’est écrit en PHP et on serait en plein dedans. Mmm, c’est écrit en PHP…

Mais n’allons pas si vite en besogne, un forum ?! Bien sûr les emails continuent à être utilisé à la radio mais il y a une volonté de discussions transversales et d’inclusivité, et ça n’est pas arrivé avec les emails (et comme on ne peut plus vraiment organiser de grands moments de rencontres physiques, fallait autre chose…).

Aussi j’écris années 90 mais je sais que ça n’a jamais vraiment disparu, juste dans certaines communautés on a préféré les listes de discussion, qui laissaient à chacun·e son autonomie dans la configuration de son environnement de travail idéal. Mais même là il y a des changements, avec pour ce que je suis, GNOME et Django qui se sont mis à utiliser Discourse pour leurs discussions (au moins certaines) et j’avais oublié mais même côté Debian ça a pu être discuté (voir cet article de lwn). En passant, un argument qui est généralement sorti pour convaincre les récalcitrants c’est qu’il y a une intégration email, un mode « mailing list ». La réalité à l’usage c’est que c’est quand même du flan.

Sachant cela me voilà quand même résolu, j’ai commencé à lire, notamment comment je pourrai déléguer l’authentification à notre système, ça me semble tout à fait jouable (DiscourseConnect - Official Single Sign-On for Discourse). Reste à commencer l’installation mais là ce n’est pas gagné, "Hosting Rails applications is complicated" dans le guide d’installation, qui renvoie vers une image Docker. Docker ça sera et on a droit ici à un script d’installation tout gentil, façon « pas assez de mémoire et voilà je te crée un swapfile », et puis ça télécharge des Go et ça dit pas assez d’espace disque et ça propose gentiment de virer les bouts docker pas utilisés mais jamais ça suffit et je vais m’arrêter là. Abandon. Chercher autre chose.

Il y a quelques années j’avais vu Flarum et c’est PHP/MySL mais ça semblait moderne quand même, je regarde à nouveau, le développement est actif, c’est traduit en français, il y a de vraies instructions d’installation, qui utilisent composer, le système de packaging des modules PHP. Let’s go.

Et ça commence par composer qui râle aussi sur la mémoire, mmap() failed: [12] Cannot allocate memory, et ok j’ai compris, j’alloue davantage de mémoire à cette machine et ça s’installe et c’est très bien et ça fonctionne.

Mettre en place l’authentification maintenant, il y a un module pseudo-générique OAuth, pseudo-générique c’est-à-dire hardcodé pour plusieurs fournisseurs (Facebook, Google, Twitter, GitHub, GitLab) et donc j’y vais un peu la hache remplacer les mentions de GitLab par PanikDB et configurer les URL pour pointer vers notre système.

PanikB donc où j’ai entretemps codé l’implémentation d’OAuth la moins complète possible, juste assurer le taf de la connexion depuis le forum, avec tous les raccourcis possibles, puis j’ai eu un peu honte quand même et je l’ai fait fonctionner avec une petite application de test faisant de l’OAuth. Ça reste minimal, 30 lignes pour les modèles, 80 pour les vues, le code est bien sûr disponible (panikdb/oauth).

Flarum, c’est du PHP tout moderne, limite agréablement structuré, il reste heureusement dans le code quelques bizarreries, comme une méthode getId() qui ne trouvait pas d’identifiant et ça traitait alors une chaine vide, qui se trouvait traduite en 0 et là mystère pas éclairci il se trouvait ensuite à associer ça à un utilisateur existant déjà dans la  base de données, sans rapport. (problème contourné en assurant une chaine aléatoire dans un attribut id).

Bref quelques petits détails de debug, mais jamais rien de compliqué, plutôt de l’ordre sabotage d’une méthode qui plantait méchamment quand elle ne recevait rien, « sabotage » facile, juste :

  private function uploadAvatarFromUrl(User $user, string $url) {
+    if (!$url) return;
     $image = (new ImageManager)->make($url);
     (…)

Et honnêtement pour le debug, ça a souvent été assez agréable, en modifiant config.php, 'debug' => true on obtient des jolies pages d’erreur. Et quand ça ne marchait pas, quand dans d’autres moment ça foirait juste moche, il restait cette variation du debug par print() : le debug par levée d’exceptions, façon throw new Exception(’user email’ . $user->getEmail());.

Ça se termine ainsi, avec un système fonctionnel et qui commence à être utilisé, et moi qui me trouve presque à avoir écrit positivement sur PHP.