An open API service indexing awesome lists of open source software.

https://github.com/rxcod9/php-swoole-crud-microservice

PHP Swoole CRUD Microservice [WORKING DEMO]
https://github.com/rxcod9/php-swoole-crud-microservice

crud microservice mysql php pool swoole

Last synced: 2 months ago
JSON representation

PHP Swoole CRUD Microservice [WORKING DEMO]

Awesome Lists containing this project

README

          

# PHP Swoole CRUD Microservice

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](https://github.com/rxcod9)

# โš™๏ธ Swagger / OpenAPI
![Swagger](docs/images/swagger.webp)

# โšก๏ธ Performance
![Performance](docs/images/performance.webp)

# โค๏ธ Health
![Performance](docs/images/health.webp)

# ๐Ÿ“Š Grafana Dashboards
![Grafana1](docs/images/grafana1.webp)
![Grafana2](docs/images/grafana2.webp)
![Grafana3](docs/images/grafana3.webp)

[![Latest Version](https://img.shields.io/github/v/release/rxcod9/php-swoole-crud-microservice?style=flat-square)](https://github.com/rxcod9/php-swoole-crud-microservice/releases)
![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/rxcod9/php-swoole-crud-microservice/run-tests.yml?branch=main&label=tests)
[![Total Downloads](https://img.shields.io/packagist/dt/rxcod9/php-swoole-crud-microservice.svg?style=flat-square)](https://packagist.org/packages/rxcod9/php-swoole-crud-microservice)

---

## ๐Ÿš€ Features

- โšก๏ธ 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

---

## ๐Ÿ Getting Started

### ๐Ÿงฐ Prerequisites

**Docker** & **Docker Compose**

### ๐Ÿณ Docker Hub Quick Start

If you prefer using the pre-built Docker image, follow these steps:

```bash
# 1๏ธโƒฃ Prepare environment file
# Copy the example .env file (you can modify it to match your setup)
cp .env.example .env
```

```bash
# 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=9501
```

Now run the container:

```bash
# ๐Ÿ™ 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.php
```

### ๐Ÿงฉ Docker Compose Usage

This repository includes a `docker-compose.yml` to run the full stack:

```bash
# โ–ถ๏ธ 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 -f
```

Edit `.env` or `docker-compose.override.yml` to customize ports and database credentials.

### โšก๏ธ Quick Start

```bash
# ๐Ÿ“‹ Copy example environment
cp .env.example .env

# ๐Ÿ“ฆ Install PHP dependencies
composer install

# ๐Ÿš€ Start all services in detached mode
docker compose up -d --build
```

### ๐Ÿ—„๏ธ Database Migration

```bash
# ๐Ÿงญ Run migrations inside the app container
docker compose exec app php scripts/migrate.php
```

### ๐Ÿ“˜ API Documentation

```bash
# ๐Ÿงฉ Generate OpenAPI spec
php bin/generate-swagger.php
```

Access Swagger UI at [http://localhost:8080](http://localhost:8080)

---

## ๐Ÿง  Example API Usage

```bash
# โž• 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'
```

---

## โš™๏ธ Benchmarking

```bash
# ๐Ÿงช 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.3 \
-e COOL_PERCENT=0.3 \
-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
```

---

## ๐Ÿ“ก Monitoring

- ๐Ÿ“ˆ **Prometheus** scrapes metrics from the app, MySQL exporter and Redis Exporter.
- ๐Ÿ“Š **Grafana** visualizes metrics (default port: `3000`).

---

## โš™๏ธ Environment Variables

All configurable options are defined in `docker-compose.yml` and `.env.example`.

---

## ๐Ÿงพ License

MIT