eor_bah545 / asyncio
Async/await for PHP 8.1+ using Fibers. Event loop, promises, timers, HTTP server — all in one file, no dependencies.
Requires
- php: >=8.1
Requires (Dev)
- phpunit/phpunit: ^13.1
This package is not auto-updated.
Last update: 2026-05-24 20:22:09 UTC
README
Async/await for PHP
Promises Async/await for PHP 8.1+ using Fibers.
Asyncio est une librairie asynchrone 100% PHP sans dépendance externe.
Elle apporte un vrai mécanisme async/await grâce aux Fibers, une boucle d'événements, des promesses chaînables et des primitives de synchronisation (Queue, Lock, Event, Future).
Un serveur HTTP asynchrone est inclus pour exécuter vos handlers de manière non‑bloquante en guise d'exemple.
Documentation
Une documentation complète est disponible au dossier docs. Explorez des guides détaillés, des exemples et des tutoriels pour tirer le meilleur parti de la library.
Installation
Install depuis packagist avec composer.
composer require eor_bah545/asyncio
Vous pouvez egalement utiliser github
git clone https://github.com/phoenixshareplus/asyncio.git
cd asyncio
composer dump-autoload
Requirements
PHP 8.1 ou une version supérieur est requis pour utiliser la library asyncio pour un support des Fibers.
Usage
La librairy asyncio prend en charge a la fois l'asynchrone et le synchrone. Pour un ensemble complet d'exemples illustrant les capacités de la librairy, notamment les promises, les events, et bien plus encore, reportez vous au dossier examples.
Asyncio Utilisation
Initialez des processus async/await en créer des fonction non blockante avec un support de then et catch pour capturer les reponse ou les erreur sans
bloquer l'execution du code et on peut definir des tache en parallèle.
use EorBah545\Asyncio\Asyncio; use function EorBah545\Asyncio\await; // Définit une tâche asynchrone $task = Asyncio::async(function (string $name) { echo "[$name] Début\n"; await(Asyncio::sleep(1.5)); // pause non‑bloquante echo "[$name] Fin\n"; return "$name OK"; }); // Lance deux tâches en parallèle $prom1 = $task("T1"); $prom2 = $task("T2"); $prom1->then(function($res) { echo "$res\n"; }); $prom2->then(function($res) { echo "$res\n"; }); // Exécute la boucle d'événements Asyncio::run(function () { await(Asyncio::sleep(2)); // laisse le temps aux tâches });
Si vous utilisez notre server defini dans les exemple alors nous pourriez definir des methodes get ou post avec des fonction totalement asynchrone qui ne bloque pas le threads.
use EorBah545\Examples\HttpServer; use EorBah545\Asyncio\Asyncio; use function EorBah545\Asyncio\await; $server = new HttpServer("MonApp"); $server->get('/', function ($request, Asyncio $async) { await($async::sleep(1)); // simulation d'un traitement long return ['message' => 'Hello World']; }); $server->post('/data', function ($request, Asyncio $async) { $body = json_decode($request['body'], true); return ['received' => $body]; }); $server->run(8000);
Une fois le script executer avec php le serveur srra mus en marche sur le port 8000, ensuite testez avec curl http://localhost:8000/ – la réponse arrive après 1 seconde, sans bloquer le serveur.
Primitives de synchronisation:
Queue
$queue = new Queue(2); await($queue->put($item)); $item = await($queue->get());
Il faut absolument comprendre que l'utilisation d'await hors d'une fonction asynchrone defini par Asyncion::run genere automatiquement une exception.
Lock
$lock = new Lock(); await($lock->acquire()); // section critique $lock->release();
Event
$event = new Event(); await($event->wait()); // sera réveillé par $event->set() $event->clear();
Future
$future = new Future(); $future->set_result(42); $result = await($future->await());
Advanced Features
Asyncio
async(callable $fn): \Closure Transforme une fonction en coroutine retournant une Promise.run(callable $coroutine): mixed Exécute une coroutine et démarre la boucle événementielle.sleep(float $seconds): Promise Promesse résolue après $seconds secondes (non‑bloquant).gather(array $promises): Promise Équivaut à Promise::all().wait(array $promises): Promise Équivaut à Promise::allSettled().timeout(callable $coroutine, float $seconds): Promise Rejette si la coroutine dépasse le délai.ErrorHandling(callable $asyncFunc): \Closure Décore une fonction async pour capturer les erreurs et retourner null.createTask(callable $coroutine): Promise Lance une coroutine dans une Fiber et retourne une promesse.
Promise
then(?callable $onFulfilled, ?callable $onRejected): Promisecatch(callable $onRejected): Promiseawait(): mixed (à utiliser uniquement dans une coroutine)- Méthodes statiques :
resolve($value),reject($reason),all($promises),allSettled($promises),race($promises)
Scheduler
getInstance(): selfrun(callable $coroutine): voidaddTimer(float $seconds, callable $callback): voidonReadable($stream, callable $callback): voidonWritable($stream, callable $callback): voidremoveStream($stream): void
License
La librairy Asyncio est distribué sous la license Apache-2.0.
Contributing
Consulter la documentation sur la contribution à ce projet.