Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/edmonddantes/amphp-pool
Middle-level library for creating Stateful Asynchronous server-side applications using the pure PHP and AMPHP Library.
https://github.com/edmonddantes/amphp-pool
amphp asynchronous stateful
Last synced: 3 months ago
JSON representation
Middle-level library for creating Stateful Asynchronous server-side applications using the pure PHP and AMPHP Library.
- Host: GitHub
- URL: https://github.com/edmonddantes/amphp-pool
- Owner: EdmondDantes
- License: mit
- Created: 2024-05-19T09:33:08.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2024-10-13T08:52:22.000Z (4 months ago)
- Last Synced: 2024-10-13T12:46:02.114Z (4 months ago)
- Topics: amphp, asynchronous, stateful
- Language: PHP
- Homepage:
- Size: 1.13 MB
- Stars: 2
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# AmPHP Pool [![PHP Composer](https://github.com/EdmondDantes/amphp-pool/actions/workflows/php.yml/badge.svg)](https://github.com/EdmondDantes/amphp-pool/actions/workflows/php.yml)
Middle-level library for creating **Stateful** **Asynchronous** server-side applications
using the **pure PHP** and [AMPHP Library](https://github.com/amphp) ![AMPHP](https://avatars.githubusercontent.com/u/8865682?s=50&v=4)* without *additional extensions* (such as `Swoole`)
* without auxiliary tools from *other* programming languages (such as `Go` + `Roadrunner`)## Why is this needed?
* You want to use only pure PHP without additional extensions.
* You want to control how your Workers operate,
and you want to be able to program their behavior to ensure a better balance of performance and stability.## Features
* Workers for handling connections and background tasks (**jobs**), which are restarted and scaled on demand.
* Support for different `types` and `groups` of Workers with varying behaviors.
* Strategies for `restarting`, `scaling`, and `pickuping` Workers for load distribution.
* Execution of **Jobs** based on `priority` and `weight` (*weight being an estimate of resource consumption*).
* `Coroutine Scheduler` for distributing a load among long-running background jobs.
* Support for telemetry and statistics with **Prometheus** + **Grafana**.
* Support for **Windows**.![Architecture](docs/images/worker-pool.svg)
## But isn't PHP slow?
Please review the [performance considerations](docs/01-performance-considerations.md).
## Installation
```bash
composer require ifcastle/amphp-pool
```## Example
```php
pushProcessor(new PsrLogMessageProcessor());
$logHandler->setFormatter(new ConsoleFormatter());$logger = new Logger('server');
$logger->pushHandler($logHandler);
$logger->useLoggingLoopDetection(false);// 1. Create a worker pool with a logger
$workerPool = new WorkerPool(logger: $logger);// 2. Fill the worker pool with workers.
// We create a group of workers with the Reactor type, which are intended to handle incoming connections.
// The HttpReactor class is the entry point for the workers in this group.
// Please see the HttpReactor class for more details.
$workerPool->describeGroup(new WorkerGroup(
entryPointClass: HttpReactor::class,
workerType: WorkerTypeEnum::REACTOR,
minWorkers: 1
));// 3. Run the worker pool
// Start the main loop of the worker pool
// Now the server is ready to accept incoming connections.
// Try http://127.0.0.1:9095/ in your browser.
$workerPool->run();
```Please also read the [Getting Started](docs/00-getting_started.md) guide.
## Prometheus + Grafana
![Prometheus](docs/images/prometheus.png)
Please see: [How to setup Grafana Dashboard](docs/00-getting_started.md#prometheus-metrics-and-grafana-dashboard)