spawn

(PHP 8.6+, True Async 1.0)

spawn() — Lance une fonction pour exécution dans une nouvelle coroutine. Crée une coroutine.

Description

spawn(callable $callback, mixed ...$args): Async\Coroutine

Crée et démarre une nouvelle coroutine. La coroutine sera exécutée de manière asynchrone.

Paramètres

callback Une fonction ou closure à exécuter dans la coroutine. Peut être n’importe quel type callable valide.

args Paramètres optionnels passés au callback. Les paramètres sont passés par valeur.

Valeurs de retour

Retourne un objet Async\Coroutine représentant la coroutine lancée. L’objet peut être utilisé pour :

Exemples

Exemple #1 Utilisation basique de spawn()

<?php
use function Async\spawn;
use function Async\await;

function fetchData(string $url): string {
    return file_get_contents($url);
}

$coroutine = spawn(fetchData(...), 'https://php.net');

// La coroutine s'exécute de manière asynchrone
echo "Coroutine started\n";

$result = await($coroutine);
echo "Result received\n";
?>

Exemple #2 Plusieurs coroutines

<?php
use function Async\spawn;
use function Async\await;

$urls = [
    'https://php.net',
    'https://github.com',
    'https://stackoverflow.com'
];

$coroutines = [];
foreach ($urls as $url) {
    $coroutines[] = spawn(file_get_contents(...), $url);
}

// Toutes les requêtes s'exécutent de manière concurrente
foreach ($coroutines as $coro) {
    $content = await($coro);
    echo "Downloaded: " . strlen($content) . " bytes\n";
}
?>

Exemple #3 Utilisation avec une closure

<?php
use function Async\spawn;
use function Async\await;

$userId = 123;

$coroutine = spawn(function() use ($userId) {
    $userData = file_get_contents("https://api/users/$userId");
    $userOrders = file_get_contents("https://api/orders?user=$userId");

    return [
        'user' => json_decode($userData),
        'orders' => json_decode($userOrders)
    ];
});

$data = await($coroutine);
print_r($data);
?>

Exemple #4 spawn avec Scope

<?php
use function Async\spawn;
use Async\Scope;

$scope = new Scope();

$scope->spawn(function() {
    echo "Coroutine 1\n";
});

$scope->spawn(function() {
    echo "Coroutine 2\n";
});

// Attendre que toutes les coroutines du scope soient terminées
$scope->awaitCompletion();
?>

Exemple #5 Passage de paramètres

<?php
use function Async\spawn;
use function Async\await;

function calculateSum(int $a, int $b, int $c): int {
    return $a + $b + $c;
}

$coroutine = spawn(calculateSum(...), 10, 20, 30);
$result = await($coroutine);

echo "Sum: $result\n"; // Sum: 60
?>

Exemple #6 Gestion des erreurs

Une façon de gérer une exception depuis une coroutine est d’utiliser la fonction await() :

<?php
use function Async\spawn;
use function Async\await;

$coroutine = spawn(function() {
    if (rand(0, 1)) {
        throw new Exception("Random error");
    }
    return "Success";
});

try {
    $result = await($coroutine);
    echo $result;
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>

Notes

Note : Les coroutines créées via spawn() s’exécutent de manière concurrente, mais pas en parallèle. PHP TrueAsync utilise un modèle d’exécution monothread.

Note : Les paramètres sont passés à la coroutine par valeur. Pour passer par référence, utilisez une closure avec use (&$var).

Journal des modifications

Version Description
1.0.0 Ajout de la fonction spawn()

Voir aussi