PHP8

WordPress : tester la compatibilité avec PHP 8

Aujourd’hui, nous allons tester la compatibilité avec PHP 8 de tous les sites WordPress du serveur, en ligne de commande et de manière automatisée.

Fin du support pour PHP 7.4 pour novembre 2022

Le cycle de vie de PHP 7.4 est atteint et il n’y aura plus de mises à jour ni de support à la fin du mois de novembre 2022. Cela signifie qu’il est désormais temps de passer sous PHP 8 pour bénéficier des dernières améliorations techniques de PHP et des mises à jour de sécurité.

Et mieux vaut s’y prendre un peu plus tôt, notamment si vous possédez une boutique WooCommerce pour ne pas être pris au dépourvu en pleine période de fêtes (Black Friday, Noël…).

Tester votre code avec php-parallel-lint

Nous allons créer un nouveau projet composer avec php-parallel-lint qui se chargera de scanner notre code et de remonter toutes les incompatibilités, fonctions obsolètes ou problématiques susceptibles de donner des avertissements ou des erreurs lors du basculement vers PHP 8.

Commençons par installer php-parallel-lint:

composer create-project php-parallel-lint/php-parallel-lint php-parallel-lint --no-dev

# ou avec un user :
# sudo su -l www-data -s /bin/bash -c "composer create-project php-parallel-lint/php-parallel-lint php-parallel-lint --no-dev"Code language: PHP (php)

Résultat de la commande:

Creating a "php-parallel-lint/php-parallel-lint" project at "./php-parallel-lint"
Installing php-parallel-lint/php-parallel-lint (v1.3.2)
  - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive
Created project in /Users/matt/Downloads/project-ACTAGIS-php8-202208/php-parallel-lint
Loading composer repositories with package information
Updating dependencies
Lock file operations: 4 installs, 0 updates, 0 removals
  - Locking nette/tester (v2.4.2)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking squizlabs/php_codesniffer (3.7.1)
Writing lock file
Installing dependencies from lock file
Nothing to install, update or remove
2 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload filesCode language: JavaScript (javascript)

Installons maintenant l’outil qui permet de coloriser le code dans notre console:

composer require --dev php-parallel-lint/php-console-highlighterCode language: JavaScript (javascript)

Résultat:

Info from https://repo.packagist.org: #StandWithUkraine
Using version ^1.0 for php-parallel-lint/php-console-highlighter
./composer.json has been created
Running composer update php-parallel-lint/php-console-highlighter
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Downloading php-parallel-lint/php-console-color (v1.0.1)
  - Downloading php-parallel-lint/php-console-highlighter (v1.0.0)
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
Generating autoload filesCode language: JavaScript (javascript)

Scanner le code avec php-parallel-lint

Voici la syntaxe pour scanner votre code:

 ./php-parallel-lint/parallel-lint FOLDER_TO_SCAN -p PHP_VERSION

Lire la suite

PHP Composer Banner

PHP : installer Composer sous Ubuntu Server

Voici comment installer Composer, le gestionnaire de dépendances PHP, sur Ubuntu Server.

Composer simplifie énormément la gestion des bibliothèques PHP. Au lieu de télécharger manuellement des paquets, de gérer leurs dépendances, puis de vérifier leurs versions une par une, on décrit les besoins du projet dans un fichier composer.json, et Composer s’occupe du reste.

Je l’utilise notamment pour auditer des sites hébergés sur un serveur, tester la compatibilité avec une version récente de PHP, installer des outils de développement, ou gérer les dépendances d’un plugin WordPress. On peut évidemment tout rapatrier en local, mais parfois, tester directement sur le serveur évite un aller-retour de fichiers parfaitement inutile.

Composer peut s’installer localement dans un projet, ou globalement comme commande système. La documentation officielle présente ces deux approches : installation locale dans un projet, ou installation globale comme exécutable disponible partout.

Installer les paquets prérequis

On commence par mettre à jour la liste des paquets :

sudo apt update

Ensuite, on installe les dépendances utiles :

sudo apt install curl unzip php-cli php-mbstring php-xml php-curl

Le paquet php-cli permet d’exécuter PHP en ligne de commande. curl sert à télécharger l’installeur. unzip permet d’extraire certaines archives de paquets. Enfin, php-mbstring, php-xml et php-curl évitent pas mal d’avertissements selon les dépendances installées.

On peut vérifier la version de PHP disponible en CLI :

php -v

Et vérifier les extensions chargées :

php -m

Télécharger l’installeur de Composer

On télécharge l’installeur officiel depuis le site de Composer :

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"Code language: JavaScript (javascript)

On peut aussi utiliser curl :

curl -sS https://getcomposer.org/installer -o composer-setup.phpCode language: JavaScript (javascript)

Les deux méthodes fonctionnent. Si votre installation PHP a un problème de certificats SSL, curl peut parfois donner une erreur plus lisible. Charmant, mais utile.

Vérifier la signature de l’installeur

Avant d’exécuter l’installeur, il faut vérifier sa signature SHA-384. Le hash change régulièrement, donc récupérez toujours la valeur actuelle depuis la page officielle de téléchargement de Composer. La page officielle affiche les commandes de téléchargement, de vérification, d’exécution et de suppression de l’installeur.

Voici la méthode automatisée :

EXPECTED_SIGNATURE="$(curl -s https://composer.github.io/installer.sig)"
ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]; then
    echo "Installer corrupt"
    rm composer-setup.php
    exit 1
fi

echo "Installer verified"Code language: PHP (php)

Si la commande affiche Installer verified, on peut continuer. Si elle affiche Installer corrupt, on supprime le fichier et on recommence. Pas de bravoure inutile ici.

Installer Composer globalement

Pour installer Composer comme commande disponible partout sur le serveur, on l’installe dans /usr/local/bin :

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composerCode language: JavaScript (javascript)

Composer sera alors accessible avec la commande :

composer

On peut vérifier l’installation avec :

composer --version

Enfin, on supprime l’installeur :

rm composer-setup.phpCode language: CSS (css)

La documentation officielle indique que l’installeur télécharge le dernier composer.phar, et que l’installation globale permet d’utiliser Composer comme exécutable système.

Installation complète en une seule séquence

Voici la séquence complète, pratique à garder sous le coude :

sudo apt update
sudo apt install curl unzip php-cli php-mbstring php-xml php-curl

curl -sS https://getcomposer.org/installer -o composer-setup.php

EXPECTED_SIGNATURE="$(curl -s https://composer.github.io/installer.sig)"
ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]; then
    echo "Installer corrupt"
    rm composer-setup.php
    exit 1
fi

echo "Installer verified"

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php

composer --versionCode language: PHP (php)

Cette version évite de copier-coller manuellement une signature qui peut devenir obsolète.

Installer Composer localement dans un projet

Il n’est pas obligatoire d’installer Composer globalement. On peut aussi l’installer dans un projet sous forme de fichier composer.phar.

Depuis le dossier du projet :

php composer-setup.phpCode language: CSS (css)

Composer crée alors un fichier :

composer.pharCode language: CSS (css)

On l’utilise ensuite ainsi :

php composer.phar installCode language: CSS (css)

Cette approche peut être utile sur un hébergement où vous n’avez pas les droits sudo, ou quand vous voulez figer Composer dans un environnement précis.

Composer installé via APT ou via l’installeur officiel ?

Ubuntu propose parfois un paquet composer dans ses dépôts :

sudo apt install composer

C’est simple, mais la version peut être plus ancienne que celle proposée par le projet Composer. Pour un serveur de développement ou un serveur qui doit tester des projets récents, je préfère l’installation officielle via l’installeur Composer.

Autre différence importante : si Composer a été installé via un gestionnaire de paquets système, la commande self-update peut ne pas être disponible. La documentation Composer précise que self-update n’est pas disponible si Composer n’a pas été installé comme PHAR, ce qui peut arriver avec une installation par gestionnaire de paquets.

Mettre à jour Composer

Pour mettre à jour Composer lui-même, il ne faut pas utiliser :

composer update

Cette commande met à jour les dépendances du projet courant. Elle lit le fichier composer.json, tient compte de composer.lock, puis met à jour les paquets du projet. Ce n’est pas la commande qui met à jour l’exécutable Composer.

Pour mettre à jour Composer lui-même, utilisez :

sudo -H composer self-updateCode language: PHP (php)

La documentation officielle indique que self-update remplace le fichier composer.phar par la dernière version disponible. Elle précise aussi qu’une installation globale peut nécessiter les droits root.

Pour revenir à la version précédente si quelque chose se passe mal :

sudo -H composer self-update --rollbackCode language: PHP (php)

Et pour forcer le canal stable :

sudo -H composer self-update --stableCode language: PHP (php)

Installer les dépendances d’un projet

Une fois Composer installé, on se place dans le dossier du projet, là où se trouve le fichier composer.json :

cd /home/www/example.com/public_html

Pour installer les dépendances exactes définies par composer.lock :

composer install

Pour mettre à jour les dépendances selon les contraintes du fichier composer.json :

composer update

La distinction est importante :

  • composer install installe ce qui est verrouillé dans composer.lock ;
  • composer update recalcule les versions et modifie composer.lock ;
  • composer self-update met à jour Composer lui-même.

En production, on utilise généralement composer install, pas composer update. Sinon, on change les versions des dépendances directement sur le serveur. Sportif, mais pas idéal.

Commandes utiles sur un serveur

Voici quelques commandes que j’utilise souvent après l’installation de Composer.

Vérifier la configuration :

composer diagnose

Afficher la version :

composer --version

Afficher la configuration globale :

composer config --global --listCode language: PHP (php)

Valider un fichier composer.json :

composer validate

Lister les paquets installés :

composer show

Voir pourquoi un paquet est installé :

composer why vendor/package

Voir pourquoi une version de PHP bloque une dépendance :

composer why-not php 8.3Code language: CSS (css)

Cette dernière commande est très pratique pour auditer la compatibilité d’un projet avec PHP 8.2, PHP 8.3 ou PHP 8.4.

Utiliser Composer pour tester la compatibilité PHP

Si l’objectif est de vérifier si un projet accepte une version donnée de PHP, Composer peut donner une première indication.

Depuis le dossier du projet :

composer check-platform-reqs

Cette commande vérifie les exigences de plateforme, comme la version de PHP et les extensions nécessaires.

On peut aussi simuler une version de PHP dans la configuration Composer du projet :

composer config platform.php 8.3.0Code language: CSS (css)

Puis demander pourquoi certaines dépendances bloquent :

composer update --dry-run
composer why-not php 8.3Code language: CSS (css)

Le --dry-run permet de tester sans écrire les changements. Toujours appréciable quand on préfère éviter les surprises en production. Étonnant, je sais.

Composer et WordPress

Dans l’écosystème WordPress, Composer sert souvent à gérer des dépendances dans un plugin, un thème, un mu-plugin, ou un projet complet basé sur Bedrock.

Pour un plugin WordPress, on peut par exemple installer une bibliothèque PHP :

composer require vendor/packageCode language: JavaScript (javascript)

Puis charger l’autoloader dans le plugin :

<?php
/**
 * Plugin Name: Example Composer Plugin
 */

defined( 'ABSPATH' ) || exit;

$autoload = __DIR__ . '/vendor/autoload.php';

if ( is_readable( $autoload ) ) {
    require_once $autoload;
}Code language: HTML, XML (xml)

Dans un plugin distribué publiquement, pensez à inclure le dossier vendor dans le zip final, sauf si votre processus de déploiement installe les dépendances automatiquement. WordPress.org n’exécute pas Composer pour les utilisateurs.

Éviter d’exécuter Composer en root dans les projets

Installer Composer globalement avec sudo est normal, car on écrit dans /usr/local/bin. En revanche, exécuter composer install ou composer update en root dans un projet est rarement une bonne idée.

Dans un site web, utilisez plutôt l’utilisateur propriétaire des fichiers du site. Par exemple :

sudo -u www-data composer install --no-dev --optimize-autoloader

Ou, selon votre organisation serveur :

sudo -u deploy composer install --no-dev --optimize-autoloader

Cela évite de créer des fichiers appartenant à root dans le projet. Sinon, le prochain déploiement ou la prochaine mise à jour risque de râler. Et il aura raison.

Installation optimisée pour production

Sur un serveur de production, on installe généralement les dépendances sans les outils de développement :

composer install --no-dev --prefer-dist --optimize-autoloader

Pour des projets plus sensibles aux performances, on peut ajouter l’autoloader classmap autoritaire :

composer install --no-dev --prefer-dist --optimize-autoloader --classmap-authoritative

Cette option peut améliorer les performances d’autoloading, mais elle suppose que toutes les classes soient correctement déclarées dans l’autoload Composer. À utiliser quand le projet est propre.

Résoudre les erreurs fréquentes

Si Composer se plaint d’une extension manquante, installez le paquet PHP correspondant. Par exemple :

sudo apt install php-zip php-intl php-gd php-mysql php-bcmath

Puis vérifiez que l’extension est bien chargée :

php -m | grep zip

Si Composer échoue à cause de certificats SSL, vérifiez les certificats racines :

sudo apt install ca-certificates
sudo update-ca-certificates

Si la mémoire manque pendant une opération lourde :

COMPOSER_MEMORY_LIMIT=-1 composer install

Ce n’est pas une solution élégante à utiliser partout, mais cela dépanne lors d’un audit ou d’une migration ponctuelle.

Désinstaller Composer

Si Composer a été installé globalement dans /usr/local/bin, la désinstallation est simple :

sudo rm /usr/local/bin/composer

On peut vérifier qu’il n’est plus disponible :

which composer
composer --version

Si Composer a été installé via APT :

sudo apt remove composer

Mémo rapide

# Installer les prérequis.
sudo apt update
sudo apt install curl unzip php-cli php-mbstring php-xml php-curl

# Télécharger Composer.
curl -sS https://getcomposer.org/installer -o composer-setup.php

# Vérifier la signature.
EXPECTED_SIGNATURE="$(curl -s https://composer.github.io/installer.sig)"
ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]; then
    echo "Installer corrupt"
    rm composer-setup.php
    exit 1
fi

# Installer Composer globalement.
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

# Nettoyer.
rm composer-setup.php

# Vérifier.
composer --version

# Mettre à jour Composer lui-même.
sudo -H composer self-update

# Installer les dépendances d’un projet.
composer install

# Mettre à jour les dépendances d’un projet.
composer update

# Vérifier les exigences PHP/extensions.
composer check-platform-reqsCode language: PHP (php)

Conclusion

Installer Composer sur Ubuntu Server est simple, mais autant le faire proprement : installer les prérequis, télécharger l’installeur officiel, vérifier sa signature SHA-384, puis installer l’exécutable dans /usr/local/bin.

Une fois installé, Composer devient vite indispensable pour gérer les dépendances PHP, auditer un projet, tester une compatibilité avec PHP 8.x, ou préparer un déploiement plus propre.

Gardez surtout la distinction en tête : composer install installe les dépendances verrouillées, composer update met à jour les dépendances du projet, et composer self-update met à jour Composer lui-même. Trois commandes proches, trois effets très différents. Le genre de détail qui évite une journée délicieusement absurde.

votre macbook surchauffe

Régler le problème de surchauffe d’un MacBook

Depuis la mise à jour vers MacOS Monterey, mon MacBook Pro est en surchauffe permanente, avec le ventilateur à fond même en simple surf.

Si vous êtes confronté au même problème, voici comment j’ai réussi à retrouver un environnement de travail avec un volume de sonore acceptable (c’est-à-dire silencieux).

Solution 1 : vérifier les options de la batterie

C’est la solution qui a réglé mon problème mais j’ai mis du temps à la trouver car elle n’est indiquée nulle part sur le site du support technique d’Apple.

Ouvrez Préférences Système et cliquez sur l’icône Batterie:

macos preferences systeme batterie
Préférences Système ⟶ Batterie

Dans Batterie ⟶ Batterie, vous devez activer l’option Mode Économie d’énergie:

Dans l'onglet Batterie, activez l'option Mode économie d'énergie
Dans l’onglet Batterie, activez l’option Mode économie d’énergie

Ensuite, passez à l’onglet Adaptateur secteur et activez également l’option Mode économie d’énergie :

macos batterie secteur economie energie
Dans l’onglet Adapteur secteur, activez l’option Mode économie d’énergie

Cela a définitivement résolu mon problème et mon MacBook est redevenu silencieux. Je peux également l’avoir sur les genoux sans me brûler, ce qui est un avantage certain pour un laptop.

Lire la suite