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.
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.
Install depuis packagist avec composer.
composer require eor_bah545/asyncioVous pouvez egalement utiliser github
git clone https://github.com/phoenixshareplus/asyncio.git
cd asyncio
composer dump-autoloadPHP 8.1 ou une version supérieur est requis pour utiliser la library asyncio pour un support des Fibers.
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.
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.
$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 = new Lock();
await($lock->acquire());
// section critique
$lock->release();$event = new Event();
await($event->wait()); // sera réveillé par $event->set()
$event->clear();$future = new Future();
$future->set_result(42);
$result = await($future->await());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.
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)
getInstance(): selfrun(callable $coroutine): voidaddTimer(float $seconds, callable $callback): voidonReadable($stream, callable $callback): voidonWritable($stream, callable $callback): voidremoveStream($stream): void
La librairy Asyncio est distribué sous la license Apache-2.0.
Consulter la documentation sur la contribution à ce projet.