Quel est L'intérêt des promesses de Guzzle async?

avec Guzzle, les promesses sont-elles d'une utilité réelle? Il semble que vous appel en attente(). Le code suivant (à partir de la documentation) semble ne rien faire par lui-même:

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(
    function (ResponseInterface $res) {
        echo $res->getStatusCode() . "n";
    },
    function (RequestException $e) {
        echo $e->getMessage() . "n";
        echo $e->getRequest()->getMethod();
    }
);

si vous devez appeler $promise->wait () pour faire la demande, Quel est l'intérêt d'une promesse? Comment est-ce vraiment différent que:

$request = new Request('GET', 'http://httpbin.org/get');
$response = $client->send($request); 

if ($response

Tout ce que je peux dire, le seul avantage est que c'est une approche pratique pour définir les callbacks succès et échec de la requête. Même la section doc sur faire des requêtes multiples a le code ci-dessous, qui semble bloquer et exécuter toutes les requêtes... peut-être au "même moment". Est-ce que je devrais attendre?

// Wait on all of the requests to complete.
$results = Promiseunwrap($promises);
18
demandé sur originalbryan 2016-03-22 01:55:43

2 réponses

je prends des risques, mais d'après ce que j'ai lu...

alors que PHP ne peut pas faire de traitement asynchrone, vous ouvrez plusieurs flux et gérez leur entrée sans bloquer. Donc dans votre exemple avec une seule connexion, OUI, il n'y a aucun point/avantage.

mais disons que vous vouliez charger 5 ressources. L'utilisation des méthodes async pourrait permettre à ces ressources de se charger essentiellement en parallèle - plutôt que de seulement commencer le 2ème lorsque le 1er on a chargé.

Et Bouffer fournit des moyens pour gérer les cas d'utilisation comme "après qu'ils ont tous chargés correctement..."ou "après qu'ils ont tous soit chargé ou non...".

donc je pense qu'il devrait permettre un traitement plus rapide lors du traitement de plusieurs requêtes qui peuvent se produire simultanément.

10
répondu artfulrobot 2016-04-21 16:57:30

Async nécessite un peu de pensée inverse.

Voici un scénario qui pourrait survenir et qui pourrait être utile: Compte tenu D'une API (http://ipsum.org/) vous devez récupérer une liste de données (par id) sur votre route (ou script) - si vous le faites de manière procédurale, vous devrez faire une boucle à travers chaque requête et attendre jusqu'à ce que tout revienne.

avec la promesse de Guzzle, vous pouvez "préparer" la réponse et ensuite quand elle revient - vous pouvez la traiter. L'avantage, c'est qu'au lieu de n request x T time of request afin d'exécuter votre script, la latence est maintenant CEIL (temps de réponse le plus lent de toutes les réponses reçues) car vous "attendez" que toutes les réponses reviennent mais elles sont envoyées en parallèle à la place.

en d'autres termes, vous envoyez la requête en parallèle au lieu de la requête en série de sorte que vous attendiez la réponse au retour Ou vous pouvez pré-exécuter l'appel curl en premier, et puis faire une configuration à "ok pendant que j'attends le retour, laissez-moi préparer le réponse."

la dernière partie nécessitera une certaine restructuration puisque nous sommes habitués à "aller chercher, attendre, puis avec réponse en retour, nous pouvons opérer sur la réponse"

2
répondu azngunit81 2016-05-17 16:28:03