Problèmes avec MAMP 7.0 et PHP 8.3.8

Je suis un utilisateur assidu de MAMP, j'apprécie la simplicité de leur solution et le peu de ressources qu'il nécessite en comparaison avec d'autres solutions de développement, telles que des solutions basées sur Docker ou des Vagrant Boxes.

J'étais donc très heureux de voir que la version 7.0 couvrait toutes les dépendances de Drupal 11 :

  • PHP 8.3
  • MySQL 8.0.35

Par contre, au moment de faire mes premiers tests, l'application était très instable et je n'étais pas en mesure de sélectionner PHP 8.3. J'avais aussi quelques enjeux avec l'encodage (collation) avec MySQL qui n'était pas compatible avec notre serveur de production.

PHP

Voici ce que j'ai dû faire pour arriver à utiliser PHP 8.3 sur MAMP 7.0.

Fichier php8.3.8.fcgi

Le fichier suivant était manquant "/Applications/MAMP/fcgi-bin/php8.3.8.fcgi". J'ai dû créer le fichier en me basant sur celui de la version 8.2 et modifier les versions. Ensuite, Apache s'est ouvert avec PHP 8.3.

Fichier php.ini

J'ai aussi dû changer des includes path dans les fichiers php.ini (comme /Applications/MAMP/bin/php/php8.3.8/conf/php.ini) parce que PHP 8.2 était parfois utilisé plutôt que 8.3.

Mise à jour : cette étape ne serait plus nécessaire avec les versions les plus récentes qui viennent avec PHP 8.3.9.

Apache

Certains de nos sites utilisant des rewrite rules retournaient des erreurs 404 (The requested URL was not found on this server.) avec la nouvelle version de MAMP. C'était le cas pour tous nos sites Drupal 10.

Par défaut, le module rewrite_module n'est pas chargé dans Apache avec MAMP 7.0. Pour le réactiver, il faut réactiver une ligne dans le fichier MAMP/conf/apache/httpd.conf en retirant le # au début de la ligne :

#LoadModule rewrite_module modules/mod_rewrite.so

devient :

LoadModule rewrite_module modules/mod_rewrite.so

MySQL 8

Afin de garder une compatibilité avec notre serveur qui utilise une version moins récente de MariaDB, j'ai forcé les paramètres par défaut des tables pour utiliser des valeurs compatibles.

Par contre, ces modifications sont temporaires et devront être retirées lorsque notre serveur aura aussi une version compatible avec les dernières options de collation.

Fichier my.cnf

J'ai dû créer le fichier conf/my.cnf et y inscrire :

[mysqld]
max_allowed_packet = 64M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

Variables de MySQL

Dans MySQL, j'ai exécuté cela pour faciliter l'importation et l'exportation avec MySQL 5.

SET PERSIST default_collation_for_utf8mb4='utf8mb4_general_ci';
SET default_collation_for_utf8mb4 = "utf8mb4_general_ci";
SHOW VARIABLES LIKE 'default_collation_for_utf8mb4'

Option alternative avec Drupal

Dans le fichier settings.php de Drupal, on peut forcer la collation pour être compatible avec notre serveur:

'collation' => 'utf8mb4_general_ci'

J'aurais pu utiliser cette méthode pour arriver à une version compatible avec les deux serveurs, plutôt que de modifier les paramètres par défault de MySQL.