Installer PHP 8.4 sur le serveur

PHP 8.4 est tout beau, tout chaud: la nouvelle version est sortie le 21 novembre, comme prévue. Pas mal de nouveautés ont été intégrées. Si vous lisez ces lignes, sachez que le site tourne déjà dessus.

Faisons un petit tour d’horizon de PHP 8.4 avec ses changements, améliorations et nouveautés, avant de l’installer sur notre serveur Ubuntu.

Les nouveautés de PHP 8.4

PHP 8.4 ravira les utilisateurs avec de nombreuses fonctionnalités et améliorations impactantes. Par exemple, ils peuvent utiliser intelligemment de nouvelles fonctions de tableau, telles que :

  • array_find()
  • array_find_key()
  • array_any()
  • array_all()

De plus, il y a d’autres fonctionnalités incroyables de PHP 8.4 qui attireront l’attention des utilisateurs dès le départ, notamment :

  • Hooks de propriétés
  • Visibilité asymétrique
  • MyClass()->method() sans parenthèses
  • Changements JIT
  • Support HTML5
  • Autres fonctionnalités de PHP 8.4 à surveiller

Hooks de propriétés

Les propriétés dans les objets PHP ont offert divers avantages comme l’implémentation des validations de valeurs. Pour cette raison, les types de propriétés à partir de PHP 7 ont grandement aidé à cela.

Néanmoins, le fait que la validation doive, par nécessité, se faire via une méthode a conduit à beaucoup de code répétitif sous forme de getters et setters ou à l’abus des méthodes magiques __get et __set.

En réalité, les propriétés en lecture seule dans PHP 8 résolvent de nombreux problèmes pour les développeurs. Ils peuvent protéger les valeurs via le constructeur et offrir toujours des propriétés entièrement typées pour un accès direct.

Les Hooks de propriétés offrent également une fonctionnalité robuste pour travailler avec les propriétés de classe PHP. Les propriétés peuvent optionnellement expliquer un ou plusieurs hooks, actuellement limités à “get” et “set”, vous permettant d’intervenir dans le cycle de vie de la propriété. Voici un exemple tiré du RFC :

class User implements Named
{
    private bool $isModified = false;
    public function __construct(private string $first, private string $last) {}
    public string $fullName {
        // Override the "read" action with arbitrary logic.
        get => $this->first . " " . $this->last;
        // Override the "write" action with arbitrary logic.
        set {
            [$this->first, $this->last] = explode(' ', $value, 2);
            $this->isModified = true;
        }
    }
}Code language: PHP (php)

Visibilité asymétrique

La visibilité asymétrique est une fonctionnalité innovante qui aide les développeurs à expliquer une visibilité différente pour diverses opérations sur une propriété. Cela leur permet de contrôler intelligemment la visibilité des membres de classe, tels que les propriétés et les méthodes.

Par exemple, vous pouvez indiquer que vous souhaitez autoriser un accès public en lecture à une propriété, mais ne permettre les modifications qu’en interne :

public private(set) string $bar = 'baz';Code language: PHP (php)

La visibilité asymétrique fonctionne en parallèle avec les changements présentés avec les hooks de propriétés, y compris la possibilité de décrire la visibilité dans les interfaces.

MyClass()->method() sans parenthèses

Une pratique courante en PHP est d’instancier une classe et d’accéder immédiatement à une méthode ou une propriété. Voici un exemple ci-dessous :

$request = (new Request())->withMethod('GET')->withUri('/hello-world');Code language: PHP (php)

Nous devions entourer la classe de parenthèses lors de son instanciation, ce qui était une exigence du moteur PHP. Avec PHP 8.4, les utilisateurs peuvent omettre ces parenthèses, offrant une utilisation plus conviviale :

$request = new Request()->withMethod('GET')->withUri('/hello-world');Code language: PHP (php)

Changements JIT

PHP 8.4 a modifié la façon dont le JIT est activé. Auparavant, les utilisateurs devaient définir opcache.jit_buffer_size à 0 pour désactiver le JIT. Cependant, vous pouvez maintenant le désactiver comme décrit ci-dessous :

opcache.jit=disable
opcache.jit_buffer_size=64m

Ce changement affectera les utilisateurs s’ils avaient spécifié un opcache.jit_buffer_size mais n’avaient pas spécifié opcache.jit. Dans cette situation, les utilisateurs devront incorporer opcache.jit=tracing pour activer à nouveau le JIT. De plus, les utilisateurs constateront des améliorations du JIT, le rendant plus fluide et rapide.

Support HTML5

PHP 8.4 inclut une classe \Dom\HTMLDocument qui peut analyser efficacement le code HTML. L’ancienne classe \DOMDocument est toujours accessible pour la rétrocompatibilité.

$doc = \Dom\HTMLDocument::createFromString($contents);Code language: PHP (php)

Pour les développeurs qui analysent ou construisent du HTML en utilisant l’extension DOM, cette version fournira diverses fonctionnalités innovantes et orientées résultats, ainsi qu’un support robuste pour HTML5.

Dépréciations PHP 8.4

Outre les nouvelles fonctionnalités et améliorations de PHP 8.4, quelques dépréciations auront lieu. Ces dépréciations concernent les types nullables implicites et la dépréciation des sessions GET/POST.

Types nullables implicites

Auparavant, une variable typée avec une valeur par défaut null en PHP pouvait être rendue nullable automatiquement :

function foo(T1 $a, T2 $b = null, T3 $c) {}Code language: PHP (php)

Lorsque les types nullables ont été inclus, cette signature pouvait être obtenue explicitement :

function bar(T1 $a, ?T2 $b = null, T3 $c) {}Code language: PHP (php)

Ou via un type union :

function test(T1 $a, T2|null $b = null, T3 $c) {}Code language: PHP (php)

Cette déclaration implicite fonctionnait sans problème auparavant. Cependant, elle est maintenant dépréciée dans PHP 8.4.

Dépréciation des sessions GET/POST

Les applications web suivent les états des utilisateurs en utilisant des cookies. En PHP, les applications web effectuent cette action via des paramètres GET et POST. Pour cela, les utilisateurs doivent désactiver le paramètre “session.use_only_cookies”, utilisant les fonctionnalités implémentées dans les navigateurs avant les cookies.

Dans ce scénario, un mécanisme connu sous le nom de “session.use_trans_side” est activé pour aider à identifier un jeton de session dans les cookies ou les paramètres POST ou GET de n’importe quel utilisateur. “session.use_only_cookies” est activé par défaut, et “session.use_trans_sid” est désactivé. PHP 8.4 affichera un avertissement de dépréciation si l’une ou l’autre valeur est basculée différemment.

Autres fonctionnalités de PHP 8.4

Voici d’autres fonctionnalités impressionnantes dont les utilisateurs bénéficieront, notamment :

  • $_POST et $_FILES prennent désormais en charge des verbes HTTP supplémentaires.
  • Fonctions de trim multibyte : mb_trim(), mb_ltrim(), et mb_rtrim().
  • Nouveaux modes d’arrondi plus précis pour la fonction round().
  • Sous-classes PDO spécifiques aux pilotes pour permettre l’accès aux fonctionnalités spécifiques des pilotes.
  • Callbacks améliorés pour DOM et XSL, permettant l’utilisation de closures, de callables de première classe et de méthodes d’instance.
  • L’ajout du support d’objets paresseux (Lazy Object) fournit des fonctionnalités de bas niveau pour générer des objets fantômes, des proxies, et plus encore ; les frameworks et les ORM les consommeront généralement pour une utilisation avec des conteneurs d’injection de dépendances et l’hydratation d’objets.
  • Un nouvel attribut de moteur, #[Deprecated], pour marquer les fonctionnalités dépréciées.
  • Plusieurs améliorations des extensions BCMath, GMP et DOM.

Installation de PHP 8.4 sous Ubuntu Server

Tous les sites hébergés sur notre serveur Ubuntu tournent actuellement sous PHP 8.3, réglé aux petits oignons. Pour me simplifier la vie, j’ai pris quelques minutes pour transformer le précédent tutoriel pour PHP 8.3 pour intégrer toutes les commandes dans un unique script bash, que je peux lancer sur le serveur.

Voici le script qui s’occupe de tout cela:

#!/bin/bash

# Script: Install new PHP version on Ubuntu Server
# (c) 2024, Matt Biscay
# https://mattbiscay.com

CUR_PHP_VER="8.3"
NEW_PHP_VER="8.4"

# Array of packages to exclude. 
# This is useful if some packages are now part of PHP core, or if they are unavailable.
exclude_packages=("xhprof")

# Get the list of installed PHP packages, convert to new version, and exclude php[number] packages
packages=$(dpkg -l | grep php$CUR_PHP_VER | grep ii | awk '{print $2}' | sed "s/php$CUR_PHP_VER-//g" | grep -v '^php[0-9]' | sort -u)

# Filter out excluded packages
filtered_packages=""
for package in $packages; do
    if [[ ! " ${exclude_packages[@]} " =~ " ${package} " ]]; then
        filtered_packages+="$package "
    fi
done

# Format the packages for apt install command
formatted_packages=$(echo $filtered_packages | tr ' ' ',')

# Construct the apt install command
install_command="sudo apt install php$NEW_PHP_VER php$NEW_PHP_VER-{$formatted_packages}"

# Echo the command (for verification)
echo $install_command

# Uncomment the following line to actually run the command
eval $install_command

# Copy custom configuration
sudo cp /etc/php/$CUR_PHP_VER/fpm/conf.d/60-custom.ini /etc/php/$NEW_PHP_VER/fpm/conf.d/60-custom.ini
sudo cp /etc/php/$CUR_PHP_VER/fpm/pool.d/zzz-custom-www.conf /etc/php/$NEW_PHP_VER/fpm/pool.d/zzz-custom-www.conf

# Start new PHP at boot time
sudo systemctl enable php$NEW_PHP_VER-fpm --now
sudo service php$NEW_PHP_VER-fpm start

echo "PHP $NEW_PHP_VER installed, custom configuration copied, and FPM service enabled."Code language: PHP (php)

Le script est simple: on récupère la liste des paquets de notre PHP actuel, on les installe pour PHP 8.4, on active php8.4-fpm au démarrage du serveur et on copie notre configuration personnalisée dans le répertoire conf.d du nouveau PHP.

Il ne vous reste plus qu’à éditer les server blocks de NginX pour pointer vers php8.4-fpm.sock puis relancer nginx. On trouve tous les server blocks concernés :

grep -rin "php8.3" /etc/nginx/sites-available/Code language: JavaScript (javascript)

Et on met à jour la directive fastcgi_pass avec la dernière version de PHP-FPM, à la main – histoire de ne pas tout casser:

sudo sed -i 's/php8\.3-fpm/php8.4-fpm/g' /etc/nginx/sites-available/rocketstack.confCode language: JavaScript (javascript)

Si vous êtes vraiment sûr de votre coup (sauvegardez vos fichiers de configuration avant!), on peut automatiser et servir tous les server blocks avec PHP 8.4 :

#!/bin/bash

# Migrate alll NginX server block to PHP 8.4
# (c) 2024 Matt Biscay
# https://mattbiscay.com

# Directory containing Nginx configuration files
conf_dir="/etc/nginx/sites-available"

# Loop through all .conf files in the specified directory
for file in "$conf_dir"/*.conf; do
    # Check if the file exists to avoid errors
    if [[ -f "$file" ]]; then
        sudo sed -i 's/php8.3-fpm/php8.4-fpm/g' "$file"
        echo "Updated $file"
    fi
done

# Test the Nginx configuration
if sudo nginx -t; then
    echo "Nginx configuration is valid. Restarting Nginx..."
    sudo systemctl restart nginx
    echo "Nginx has been restarted."
else
    echo "Nginx configuration test failed. Please check the errors above."
fiCode language: PHP (php)

Bonne migration !

Envie d'ajouter des fonctionnalités exceptionnelles à votre site WordPress ou WooCommerce? Je suis là pour vous aider.

Explorons les possibilités ensemble »

Matt

Matt Biscay est développeur WordPress et WooCommerce certifié chez Codeable, ainsi que sysadmin qualifié et enseignant-chercheur. Passionné par le code performant et les solutions sécurisées, je m'efforce d'offrir une expérience utilisateur exceptionnelle sur chaque projet.

Vous avez aimé cet article ? Vous avez un projet en tête et vous pensez que je pourrais vous aider à le concrétiser ? N'hésitez pas à me contacter, je serais ravi de discuter avec vous de votre projet !

Opinions