'How to use guzzle to simulate event loop HTTP pool

test.php

<?php
//simulate different blocking times
if(isset($_GET['appid'])) {
    sleep(rand(3, 10));
    echo $_GET['appid'];
    exit;
}

client.php

<?php
require './vendor/autoload.php';

use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Client;

$client = new Client();
$promise = null;

$loop = function ($appId) use($client, &$loop, &$promise) {
    $promise = $client->getAsync("http://127.0.0.1/test.php?appid={$appId}");
    $promise->then(
        function (ResponseInterface $res) use(&$loop, $appId) {
            echo $res->getBody();
            //After completing the current request, initiate the request again to simulate EventLoop
            $loop($appId);
        },
        function (RequestException $e) use(&$loop, $appId) {
            //Ignore the error and continue to simulate EventLoop
            $loop($appId);
        }
    );
};

foreach(range(1, 10) as $appId) {
    $loop($appId);
}

$promise->wait();

I try to use promise to simulate EventLoop. As shown in my example code, I have 10 application IDs. I want to launch 10 requests concurrently. At the same time, the response time of each request is different. I want to launch the request of the current application ID immediately after each request is completed to simulate EventLoop.

But I find it doesn't seem to work. How can I simulate EventLoop



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source