Le développement d'applications haute performance avec PHP nécessite souvent l'utilisation de Swoole. Cependant, l'incompatibilité native entre Swoole et Xdebug pose un défi pour le débogage. Cet article détaille la mise en place d'un environnement Docker basé sur PHP 7.4, intégrant l'extension sdebug (un fork de Xdebug optimisé pour Swoole) et l'utilisation de NFS pour accélérer les performances de compilation sur macOS.
Configuration du Dockerfile
Le fichier Dockerfile suivant utilise Alpine Linux comme base pour garantir une image légère, tout en compilant manuellement Swoole et sdebug pour assurer une compatibilité maximale.
FROM php:7.4.6-fpm-alpine3.11
# Variables d'environnement pour les versions
ENV TIMEZONE="Europe/Paris"
ENV SWOOLE_REL="4.5.1"
ENV SDEBUG_REL="sdebug_2_9-beta"
ENV DEV_PACKAGES \
autoconf \
g++ \
gcc \
make \
pkgconf \
re2c \
cmake \
curl-dev \
openssl-dev
# Configuration du système et dépendances
RUN set -ex \
&& apk update \
&& apk add --no-cache --virtual .build-deps $DEV_PACKAGES \
&& apk add --no-cache icu-dev libzip-dev libpng-dev imagemagick-dev \
&& docker-php-ext-install bcmath gd pdo_mysql zip pcntl sockets
# Compilation de Swoole
RUN cd /tmp \
&& curl -SL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_REL}.tar.gz" -o swoole.tar.gz \
&& mkdir -p swoole \
&& tar -xf swoole.tar.gz -C swoole --strip-components=1 \
&& ( \
cd swoole \
&& phpize \
&& ./configure --enable-openssl --enable-mysqlnd \
&& make -j$(nproc) && make install \
) \
&& echo "extension=swoole.so" > /usr/local/etc/php/conf.d/20-swoole.ini
# Installation de sdebug pour le débogage Swoole
RUN cd /tmp \
&& curl -SL "https://github.com/swoole/sdebug/archive/${SDEBUG_REL}.tar.gz" -o sdebug.tar.gz \
&& mkdir -p sdebug \
&& tar -xf sdebug.tar.gz -C sdebug --strip-components=1 \
&& ( \
cd sdebug \
&& phpize \
&& ./configure --enable-xdebug \
&& make && make install \
) \
&& { \
echo "zend_extension=xdebug.so"; \
echo "xdebug.remote_enable=on"; \
echo "xdebug.remote_autostart=on"; \
echo "xdebug.remote_host=host.docker.internal"; \
echo "xdebug.remote_port=9001"; \
} | tee /usr/local/etc/php/conf.d/20-sdebug.ini
RUN rm -rf /tmp/*
Accélération via NFS sur macOS
Sur macOS, le partage de fichiers standard entre l'hôte et le conteneur Docker peut être lent, ce qui impacte la vitesse de démarrage de Swoole. L'utilisation d'un montage NFS (Network File System) permet d'améliorer considérablement les Entrées/Sorties (I/O).
Configuration Docker Compose
Ce fichier définit le service PHP, expose les ports nécessaires et configure le volume NFS pour le partage du code source.
version: '3.7'
services:
php-swoole:
image: custom-php74-swoole:latest
container_name: php_dev_container
ports:
- "9501:9501"
networks:
- dev-network
volumes:
- project-data:/var/www/html
stdin_open: true
tty: true
networks:
dev-network:
driver: bridge
volumes:
project-data:
driver: local
driver_opts:
type: nfs
o: addr=host.docker.internal,rw,nolock,hard,nfsvers=3
device: ":/Users/votre_nom/projets/mon-app"
Configuration de Nginx en tant que Proxy Inverse
Puisque Swoole agit comme son propre serveur HTTP, Nginx doit être configuré pour rdeiriger le trafic vers le conteneur Swoole.
upstream swoole_backend {
server php-swoole:9501;
keepalive 32;
}
server {
listen 80;
server_name monsite.local;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if (!-e $request_filename) {
proxy_pass http://swoole_backend;
}
}
}
Initialisation du débogage avec PHPStorm
Pour lier votre environnement Docker à PHPStorm :
- Accédez à Preferences > Languages & Frameworks > PHP.
- Configurez l'interpréteur CLI en sélectionnant "From Docker".
- Dans Debug, assurez-vous que le port correspond à celui défini dans le fichier
20-sdebug.ini(ici 9001). - Activez l'écoute des connexions de débogage dans l'IDE.
Enfin, connectez-vous au conteneur et lancez votre application :
docker exec -it php_dev_container /bin/sh
cd /var/www/html
php bin/laravels start
Avec cette architecture, vous bénéficiez d'une exécution rapide grâce à NFS, de la puissance de Swoole pour les tâches asynchrones, et de la capacité de débogage pas à pas offerte par sdebug.