Dépréciation des commandes PHP et suppression de l’interprète PHP intégré à 4D

PHP a joué un rôle crucial dans le développement web, et il a été introduit dans 4D v12 pour offrir des fonctionnalités qui n’étaient pas facilement disponibles dans le langage natif, telles que les fonctionnalités zip, hash ou LDAP. Au fil du temps, 4D a intégré un grand nombre de ces fonctions PHP dans ses fonctionnalités de base. Par conséquent, nous avons décidé de supprimer l’interpréteur PHP intégré dans 4D v20 R3 et de commencer le processus de dépréciation des commandes PHP dans la v21.

Bien que nous ne supprimions pas entièrement les commandes PHP de 4D, nous vous encourageons vivement à utiliser les system worker pour exécuter du code PHP à l’avenir.

Ce billet de blog vous guidera dans ce processus de transition, en montrant comment utiliser un interpréteur externe avec PHP Execute et en expliquant comment exécuter du code PHP de manière efficace avec un system worker.

Première étape : suppression de l’interpréteur PHP intégré à 4D

Le premier changement se produira dans 4D v20 R3 en supprimant l’interpréteur PHP intégré à 4D. PHP Execute continuera à fonctionner mais seulement avec un interpréteur PHP externe. Si vous n’êtes pas familier avec l’utilisation d’un interpréteur PHP externe, veuillez suivre ce tutoriel.

Utiliser PHP Execute avec un interpréteur PHP externe

L’utilisation d’un interpréteur PHP externe vous permet de mettre à jour à tout moment les nouvelles versions de PHP et d’installer les correctifs de sécurité dès qu’ils sont publiés. Il vous permet également d’utiliser plus de modules PHP.

Créer un fichier php.ini personnalisé

Le fichier php.ini est utilisé pour initialiser l’interpréteur PHP. Ce fichier était automatiquement créé et utilisé lors de l’appel à PHP Execute avec l’interpréteur interne. Pour l’interpréteur externe, ce fichier doit être créé et passé manuellement. Appeler PHP Execute une fois créera le fichier dans le dossier ressources de votre projet : nous vous suggérons fortement d’utiliser ce fichier pour initialiser l’interpréteur PHP externe, en le modifiant si nécessaire.

Exécuter une version CGI de PHP.

Il y a deux façons d’exécuter PHP : Avec une interface de ligne de commande (CLI) ou à travers la Common Gateway Interface (CGI). PHP Execute utilise la Common Gateway Interface, vous devez donc utiliser une version CGI de PHP.
Pour Windows, vous pouvez télécharger PHP sur le site officiel de PHP. Cette version contient à la fois les versions CLI et CGI de PHP.
Actuellement, la version sur le site officiel ne charge pas le paquet mbstring par défaut. Pour ce faire, vous devez ajouter ces lignes au fichier php.ini :

extension_dir = "./ext/"
extension=mbstring

Sur Mac, c’est un peu plus compliqué. Apple a arrêté de livrer macOS avec PHP installé (pour des raisons similaires à celles qui nous poussent à arrêter d’en livrer un). Le site officiel de PHP ne fournit pas de version pour Mac. Vous pouvez trouver des versions déjà compilées sur certains sites, mais en général, elles ne sont pas maintenues ou recommandées. Pour vous aider à faire la transition, 4D fournit l’interpréteur PHP intégré de 4D v20 sous la forme d’un binaire séparé sur product download. Notez que ce binaire ne sera pas maintenu par 4D. Si vous avez besoin de mettre à jour PHP sur Mac dans le futur, vous devrez construire votre propre binaire. Je détaillerai comment le faire plus loin dans ce billet.

Vous devez ensuite lancer PHP à travers le terminal en appelant cette commande à l’intérieur du répertoire PHP :
Sur Windows :

php-cgi -b <adresse:port> -c <chemin_vers_le_fichier_ini_de_php_à_l'extérieur_du_dossier_ressources_du_projet>.

Sur Mac :

./php-cgi -b <adresse:port> -c <chemin_vers_le_fichier_ini_de_php_à_l'extérieur_du_dossier_ressources_du_projet>.

Ou si vous utilisez le PHP intégré de 4Dv20 :
Sur Windows :

php-fcgi-4d -b <adresse:port> -c <chemin_vers_php.ini_fichier_inside_le_dossier_des_ressources_du_projet>

Sur Mac :

./php-fcgi-4d -b <adresse:port> -c <chemin_vers_php.ini_fichier_inside_le_dossier_des_ressources_du_projet>

N’oubliez pas, lorsque vous tapez un chemin, d’échapper les caractères spéciaux (comme \ et « ) en ajoutant un \ juste avant (\ et \ »).
Comme vous devez exécuter PHP sur la même machine que 4D, l’adresse doit être 127.0.0.1. Le port par défaut de PHP est 8002, qui est également le port par défaut utilisé par 4D. Nous vous encourageons à utiliser les
system worlers pour démarrer et arrêter PHP afin de ne pas avoir à le lancer manuellement.

Par exemple, pour lancer PHP avec un system worker, vous pouvez utiliser ce code :

var worker : 4D.SystemWorker
worker:=4D.SystemWorker.new("<path_to_php_cgi_executable> -b <address:port> -c <path_to_php.ini_file_inside_the_project_resources_folder>")

Et plus tard, terminez PHP avec :

worker.terminate()

Configurer les paramètres de 4D pour se connecter à votre PHP externe

Ouvrez l’onglet PHP des paramètres de la structure et entrez l’adresse IP et le port de votre serveur PHP. Ensuite, rouvrez votre projet.

Options par défaut de l’onglet PHP des paramètres de structure.
8002 est le port PHP par défaut, et comme le serveur PHP doit tourner sur la même machine que 4D vous devez utiliser l’adresse 127.0.0.1.

Appeler PHP Execute

Maintenant que votre serveur PHP est démarré et que 4D est correctement configuré, vous pouvez utiliser PHP Execute avec la même syntaxe que par le passé. Il n’est pas nécessaire de changer quoi que ce soit dans votre code tant que vous utilisez 4D v20 R3 ou une version plus récente. Pour utiliser le concept expliqué ci-dessus dans les versions antérieures, utilisez SET DATABASE PARAMETER(PHP use external interpreter;1) – qui est maintenant le paramètre par défaut de 4D. Notez que la même commande vous permet de définir l’IP ou le port de PHP par code si vous ne souhaitez pas le faire via l’interface comme expliqué ci-dessus.


Deuxième étape : Dépréciation de PHP Execute

Le deuxième changement se produira pour 4D v21 : la dépréciation de PHP Execute. La commande restera fonctionnelle, et nous n’avons pas l’intention de la supprimer de 4D. Si vous décidez d’utiliser PHP dans votre application à l’avenir, il est fortement conseillé d’utiliser les system workers pour exécuter votre code PHP.

Utiliser les system workers pour exécuter du code PHP

Installer ou compiler PHP

Sous Windows, vous pouvez télécharger PHP sur le site officiel de PHP.
Sur Mac, vous devrez compiler PHP car l’interpréteur PHP intégré 4D n’est fourni qu’avec la version fast CGI, alors que vous aurez besoin de la version CLI de PHP. Je détaillerai comment le faire plus loin dans ce billet.

Appeler PHP avec les system workers.

Laissez-moi vous donner 2 exemples de la façon d’exécuter votre code PHP avec des system workers.

Le premier exemple interprète un fichier PHP et récupère le résultat dans la variable $result.

var $worker : 4D.SystemWorker
var $result : Text

$worker:=4D.SystemWorker.new("<path_to_php_executable> -f <path_to_php_file> -c <path_to_php.ini_file_inside_the_project_resources_folder>")
$result:=$worker.wait().response

Le deuxième exemple exécute PHP en mode interactive shell, ce qui nous permet de lui envoyer directement le code PHP à interpréter. Cette façon d’exécuter du code PHP est plus optimisée si vous devez faire de nombreux appels à PHP car vous ne démarrez PHP qu’une seule fois.

var $worker : 4D.SystemWorker
var data : Texte

//Le callback onData ajoutera le résultat de l'exécution à la variable data
var $options : Objet
var $onData : 4D.Function
$onData:=Formule(data+=$2.data)
$options:=Nouvel objet("onData" ; $onData)

$worker:=4D.SystemWorker.new("<path_to_php_executable> -a -c <path_to_php.ini_file_inside_the_project_resources_folder>" ; $options)
$worker.wait(1)
data:=""
$worker.postMessage("echo \"Hello World!\";\r\n")
$worker.wait(1)
$worker.terminate()

Le résultat de l’exécution est récupéré dans la variable data, dans ce cas, Hello World !


Obtenir PHP sur Mac

La solution la plus simple pour récupérer PHP sur Mac est d’utiliser Homebrew. Malheureusement, cette solution ne permet d’obtenir PHP que sur votre machine, et vous ne pourrez pas le distribuer. Si vous voulez distribuer PHP avec votre application, vous devrez le compiler.

Utiliser Homebrew pour compiler PHP

Installer Homebrew

Vous pouvez trouver un pachage pour installer Homebrew sur GitHub.

Sinon, vous pouvez l’installer via le terminal. Tout d’abord, vous aurez besoin des Xcode tools. Appelez cette commande pour les installer :

xcode-select --install

Vous pouvez ensuite installer Homebrew avec cette commande :

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Installer PHP

Vous pouvez ensuite installer PHP avec cette commande :

brew install php

Compilation de PHP sur Mac

Si vous souhaitez distribuer votre application 4D sur Mac, vous aurez besoin d’une version embarquée de PHP. Pour la créer, vous devez en compiler une. Voici la procédure complète pour le faire :

Installer Homebrew

Pour installer Homebrew, vous aurez besoin des Xcode tools. Appelez cette commande pour les installer :

xcode-select --install

Vous pouvez ensuite installer Homebrew à l’aide de cette commande :

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Installer les programmes utilitaires

Pour compiler PHP, vous aurez besoin de groff et de pkg-config. Vous pouvez les installer en utilisant ces commandes :

brew install groff
brew install pkg-config

Compiler la bibliothèque OpenLDAP

Téléchargez la bibliothèque OpenLDAP.
Extrayez le contenu du fichier compressé :

tar -zxf <nom_de_l'archive>

Allez dans le dossier OpenLDAP et configurez l’installation :

./configure --prefix="<chemin_du_dossier_de_destination>" --disable-backends --enable-ldap --without-fetch --without-cyrus-sasl --enable-shared=no --enable-static=yes

Compilez les dépendances :

make depend

Compilez la bibliothèque :

make

Installez dans le dossier de destination :

make install

Compiler la bibliothèque OpenSSL

Télécharger la bibliothèque OpenSSL.
Extrayez le contenu du fichier compressé :

tar -zxf <nom_de_l'archive>

Allez dans le dossier OpenSSL et configurez l’installation :

./config --prefix="<chemin_du_dossier_de_destination>"

Compilez la bibliothèque :

make

Installez dans le dossier de destination :

make install

Compiler PHP

Télécharger PHP.
Extrayez le contenu du fichier compressé :

tar -zxf <nom_de_l'archive>

Allez dans le dossier PHP et configurez l’installation :

./configure --prefix="<chemin_du_dossier_de_destination>" --disable-all --enable-cgi --enable-shared=no --enable-static=yes --with-openssl="<chemin_du_dossier_de_destination_OpenSSL>" --with-ldap="<chemin_du_dossier_de_destination_OpenLDAP>" --enable-bcmath --enable-calendar --enable-exploit="<chemin_du_dossier_de_destination>"."--enable-bcmath --enable-calendar --enable-exif --enable-ftp --enable-mbstring --disable-mbregex --enable-sockets --with-sqlite3 --disable-posix --enable-ctype --enable-fileinfo --enable-filter --enable-pdo --with-pdo-sqlite --enable-phar --enable-session --enable-tokenizer --disable-opcache

Compilez la bibliothèque :

make

Installez dans le dossier de destination :

make install

Dans le dossier de destination de PHP, vous trouverez à la fois une version CGI et une version CLI de PHP. La version CGI peut être utilisée comme serveur PHP externe avec PHP Execute. La version CLI peut être utilisée avec les system workers.

Utilisez le forum si vous avez des questions

Nous voulons nous assurer que votre transition se passe le mieux possible. Nous comprenons que cela peut demander un certain effort, et nous sommes là pour vous aider à chaque étape. N’hésitez pas à utiliser le forum pour poser vos questions ou faire part de vos commentaires ; nous serons ravis de vous fournir des réponses et des conseils.

Si vous décidez de lancer une nouvelle discussion sur PHP sur le forum, n’oubliez pas d’inclure la balise « PHP ». Cela permettra à tout le monde de localiser plus facilement votre sujet.

Nicolas Brachfogel
- Product Owner & Senior Developer - Nicolas Brachfogel a rejoint 4D en 2017 en tant que développeur senior (4D Server et networking) et en tant que Product Owner pour gérer la mise en production d'Apple Silicon. Il est chargé de rédiger les user stories et de les traduire en spécifications fonctionnelles, ainsi que de s'assurer que les implémentations des fonctionnalités répondent aux besoins des clients. Diplômé de l'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas a commencé sa carrière en tant que développeur de logiciels en 2001. Après plusieurs années de programmation en Java et C++, il s'est spécialisé dans le développement client-serveur pour des sociétés de jeux vidéo. En tant que développeur/architecte serveur, il a travaillé avec succès sur les architectures serveur de nombreux jeux (Dofus Arena, Drakerz, Trivial Pursuit Go !).