Souvent, les développeurs PHP sont confrontés à la tâche de vérifier le fonctionnement d'une application Web pour plusieurs versions de l'interpréteur. Il peut être résolu de différentes manières. Vous pouvez facilement installer différentes versions de PHP sur un seul hôte, mais cela est lourd de conflits de bibliothèque et d'autres difficultés. Le deuxième extrême consiste à créer plusieurs machines virtuelles isolées avec des environnements différents, mais ici, vous ne pouvez pas vous passer d'une utilisation excessive des ressources matérielles et d'une perte de temps inutile pour déployer un environnement de travail. Pour le moment, le moyen le plus simple de résoudre ce problème est avec Docker.

Ci-dessous, je vais décrire une solution de travail pour Ubuntu 18, où le bundle Nginx + PHP-FPM est utilisé comme une pile. Cette solution évolue facilement: un conteneur avec PHP-FPM ne prend que 300 Mo en mémoire, et vous pouvez ajouter des conteneurs avec d'autres versions de l'interpréteur avec trois commandes (ou exécuter, selon vos préférences). Le deuxième avantage de cette solution est que le développeur n'a pas besoin de basculer le serveur Web entre les interprètes, car ils sont déjà espacés dans différents conteneurs (le code d'application est le même).
Addition: à en juger par les commentaires, certains lecteurs n'ont pas compris dans quels cas la solution décrite est appropriée. Par conséquent, je tiens à attirer l'attention sur le fait que tout ce qui suit est destiné à être utilisé UNIQUEMENT sur la station de travail du développeur et peut également convenir à un serveur de scène avec certaines réserves.Commençons donc ...
1. Installez Docker
sudo apt update sudo apt install ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce
2. Installez des conteneurs avec les versions nécessaires de PHP
Comme exemple de création d'un environnement de travail, les versions PHP 7.1 et 7.2 du
référentiel PHP Docker officiel
ont été utilisées . Par analogie, si vous avez une image, vous pouvez installer n'importe quelle version de PHP que vous souhaitez:
sudo docker pull php:7.1.25-fpm-stretch sudo docker create --name=fpm71 -p 127.0.0.1:9071:9000 -v /var/www:/var/www php:7.1.25-fpm-stretch sudo docker start fpm71 sudo docker pull php:7.2.13-fpm-stretch sudo docker create --name=fpm72 -p 127.0.0.1:9072:9000 -v /var/www:/var/www php:7.2.13-fpm-stretch sudo docker start fpm72
PHP-FPM fonctionne sur le port 9000 par défaut. Lors de la création des images, nous avons publié les 9000e ports conteneurs pour les ports libres de la machine hôte 9071 et 9072 (les nombres sont pris arbitrairement dans la plage non privilégiée). De plus, nous allons proxy les demandes de traitement PHP vers ces ports (le paramètre fastcgi_pass dans la configuration de l'hôte virtuel Nginx).
Il fallait aussi jeter le répertoire du projet à l'intérieur des conteneurs (/ var / www), sinon PHP-FPM jure qu'il ne voit pas les fichiers (si vous savez comment rendre ce moment meilleur / plus correct, écrivez dans les commentaires).
Vérifiez que les conteneurs sont en cours d'exécution et que les ports sont publiés correctement:
sudo docker ps -a sudo netstat -lpn
3. Configurer l'environnement pour les hôtes virtuels
Ajoutez les lignes à / etc / hosts:
127.0.0.1 project.local.php71
Créez un répertoire pour le projet:
sudo mkdir -p /var/www/project.local echo '<?php phpinfo(); ?>' | sudo tee /var/www/project.local/index.php
J'ai pris le nom du projet (project.local) et des hôtes virtuels (project.local.php71 / 72), mais vous pouvez utiliser des noms qui vous conviennent (n'oubliez pas de modifier les paramètres des hôtes virtuels).
Initialement, une seule commande phpinfo a été placée dans le fichier d'index, après avoir configuré et vérifié les performances du système, index.php devra être remplacé par celle utilisée dans le projet.
4. Installez nginx et configurez les hôtes virtuels
sudo apt install nginx
Nous créons le fichier
/etc/nginx/sites-available/project.local.php71 avec la description du premier hôte virtuel (il sera utilisé pour vérifier le fonctionnement du projet sous PHP v.7.1):
server { listen 80; server_name project.local.php71; index index.php; root /var/www/project.local; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9071; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
De même, le fichier
/etc/nginx/sites-available/project.local.php72 pour le deuxième hôte virtuel:
server { listen 80; server_name project.local.php72; index index.php; root /var/www/project.local; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9072; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
Maintenant, nous faisons des liens symboliques vers les configurations ci-dessus d'hôtes virtuels et surchargeons Nginx:
cd /etc/nginx/sites-enabled sudo ln -s ../sites-available/project.local.php71 sudo ln -s ../sites-available/project.local.php72 sudo systemctl reload nginx
5. Vérifiez
curl --silent http://project.local.php71/index.php | grep -o "PHP Version [0-9\.]\{1,\}" curl --silent http://project.local.php72/index.php | grep -o "PHP Version [0-9\.]\{1,\}"
En conséquence, nous devrions obtenir une version de PHP (à la suite du traitement de la commande phpinfo par des interprètes de différentes versions).
Maintenant, il ne reste plus qu'à télécharger votre projet dans le dossier /var/www/project.local et vous pouvez vérifier son fonctionnement dans l'interpréteur PHP 7.1 sur
http: //project.local.php71 et PHP 7.2 sur
http: //project.local.php71 .
Matériel supplémentaire1.
Guide pratique complet de Docker