A high-performance PHP CRUD microservice built with Swoole, featuring MySQL, Redis, Prometheus, Grafana, Caddy, and Swagger UI integration. Designed for scalable, observable, and containerized deployments.
By πΌ Ramakant Gangwar
- β‘οΈ Fast HTTP server powered by Swoole
- ποΈ MySQL database with connection pooling
- π Redis caching and pooling
- π Prometheus metrics endpoint
- π Grafana dashboards for monitoring
- π Caddy for HTTPS and reverse proxy
- π Swagger UI for API documentation
- β€οΈ Health checks for all services
Docker & Docker Compose
If you prefer using the pre-built Docker image, follow these steps:
# 1οΈβ£ Prepare environment file
# Copy the example .env file (you can modify it to match your setup)
cp .env.example .env# Example .env values
APP_ENV=production
APP_DEBUG=false
DB_HOST=mysql
DB_PORT=3306
DB_USER=root
DB_PASS=secret
DB_NAME=app_db
REDIS_HOST=redis
REDIS_PORT=6379
PROMETHEUS_PORT=9502
SWOOLE_HTTP_PORT=9501Now run the container:
# π Pull the latest image
docker pull rxcod9/php-swoole-crud-microservice:v1.0.24
# π Run the container with .env file
docker run --env-file .env -d -p 9501:9501 --name php-crud-microservice rxcod9/php-swoole-crud-microservice
# π§© Run database migrations inside the running container
docker exec -it php-crud-microservice php scripts/migrate.phpThis repository includes a docker-compose.yml to run the full stack:
# βΆοΈ Start all services (PHP app, MySQL, Redis, Prometheus, Grafana, Caddy)
docker compose up -d --build
# βΉοΈ Stop all services
docker compose down
# π View logs
docker compose logs -fEdit .env or docker-compose.override.yml to customize ports and database credentials.
# π Copy example environment
cp .env.example .env
# π¦ Install PHP dependencies
composer install
# π Start all services in detached mode
docker compose up -d --build# π§ Run migrations inside the app container
docker compose exec app php scripts/migrate.php# π§© Generate OpenAPI spec
php bin/generate-swagger.phpAccess Swagger UI at http://localhost:8080
# β Create a user
curl -s -X POST http://localhost:9501/users -H 'Content-Type: application/json' -d '{"name":"alice","email":"alice@example.com"}'
# π Get all users
curl -s -X GET http://localhost:9501/users -H 'Content-Type: application/json' | jq
# π Get a user by ID
curl -s -X GET http://localhost:9501/users/1 -H 'Content-Type: application/json' | jq
# π Get a user by email
curl -s -X GET http://localhost:9501/users/email/alice%40example.com -H 'Content-Type: application/json' | jq
# βοΈ Update a user
curl -i -X PUT http://localhost:9501/users/1 -H 'Content-Type: application/json' -d '{"name":"alice-updated","email":"alice-updated@example.com"}'
# β Delete a user
curl -i -X DELETE http://localhost:9501/users/1 -H 'Content-Type: application/json'# π§ͺ Using k6
k6 run --http-debug="full" k6 run k6/tests/crud_load_test.js > logs/k6.log 2>&1
# k6 command with all possible ENV variables
k6 run \
-e BASE_URL=http://localhost:9501 \
-e ENTITIES=users,items \
-e CRUD=list,read,create,update \
-e TOTAL_ENTITIES=200 \
-e HOT_PERCENT=0.1 \
-e COOL_PERCENT=0.1 \
-e TOTAL_EXECUTIONS=2000 \
-e MAX_VUS=50 \
-e MAX_DURATION=10m \
--http-debug="full" \
tests/crud_main_test.js > logs/k6.log 2>&1
# π§© Using ApacheBench
ab -n 100000 -c 100 -v 4 http://localhost:9501/users/1 2>&1 | tee ab.log- π Prometheus scrapes metrics from the app, MySQL exporter and Redis Exporter.
- π Grafana visualizes metrics (default port:
3000).
All configurable options are defined in docker-compose.yml and .env.example.
MIT





