5
respostas

Requisição assíncrona parece não acontecer

Olá,

seguindo com o que está em aula eu fiz segui teste.php:

<?php

use GuzzleHttp\Client;
use GuzzleHttp\Promise\Utils;
use Psr\Http\Message\ResponseInterface;

require_once 'vendor/autoload.php';

$client = new Client();

$promessa1 = $client->getAsync('http://localhost:8080/http-server.php');
$promessa2 = $client->getAsync('http://localhost:8000/http-server.php');

/** @var ResponseInterface[] $respostas */
$respostas = Utils::unwrap([
    $promessa1, $promessa2
]);

echo 'Respostas 1: ' . $respostas[0]->getBody()->getContents();
echo 'Respostas 2: ' . $respostas[1]->getBody()->getContents();

O comportamento é o mesmo que o "simples" get.

Ao usar o time php teste.php o resultado do tempo é somado:

time php teste.php 
Respostas 1: Resposta do servidor que levou 4 segundos
Respostas 2: Resposta do servidor que levou 2 segundos

real    0m6,038s
user    0m0,024s
sys     0m0,012s

Estou usando ubuntu 20.04

5 respostas

Olá Nicolas blza?

Cara, eu estava vendo na documentação do guzzle e ví o seguinte exemplo, que foi inclusive o que eu usei em uma emplementação minha à alguns meses atras e funcionou muito bem pra mim!

use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client(['base_uri' => 'http://httpbin.org/']);

// Initiate each request but do not block
$promises = [
    'image' => $client->getAsync('/image'),
    'png'   => $client->getAsync('/image/png'),
    'jpeg'  => $client->getAsync('/image/jpeg'),
    'webp'  => $client->getAsync('/image/webp')
];

// Wait for the requests to complete; throws a ConnectException
// if any of the requests fail
$responses = Promise\Utils::unwrap($promises);

transpondo para o seu código:

$promessas = [
    'promessa1' => $client->getAsync('http://localhost:8080/http-server.php'),
    'promessa2' => $client->getAsync('http://localhost:8000/http-server.php')
];

$respostas = Promise\Utils::unwrap($promessas);

tem mais exemplos de diferentes implementações aqui: https://docs.guzzlephp.org/en/latest/quickstart.html#async-requests

espero ter ajudado, vlw!

Rapaz, fiz e refiz... com o time php ainda aparece somado, ao invés de aparecer o valor do servidor que mais demorou :/

Segue o exemplo que fiz, seguindo o exemplo que citou:

$promessas = [
    'promessa1' => $client->getAsync('http://localhost:8080/http-server.php'),
    'promessa2' => $client->getAsync('http://localhost:8000/http-server.php')
];

$respostas = Promise\Utils::unwrap($promessas);

echo $respostas['promessa1']->getBody()->getContents();
echo $respostas['promessa2']->getBody()->getContents();

Obrigado por ter respondido (:

pow, desculpa Nicolas eu acabei me apressando e agora que eu ví que o seu exemplo estava exatamente igual ao da documentação kkkk, apenas detalhes de implementação que não alteram a execução do código né!!! Mas vou fazer assim para tentar ajudar a descobrir o pq, como agora eu estou no trabalho, vou deixar para de noite procurar o projeto onde eu usei essa ferramenta e me solucionou um problema de lentidão pq as consultas eram encadeadas e não assincronas, e tentar ver se tem alguma coisa diferente e dai eu te falo blza?

Sem problemas Armando, ficarei no aguardo! Seguirei com as aulas aqui, bom serviço pra você õ/

opa blza, eu implementei dessa forma:

$promises = [
            'byCategory' => $this->client->getAsync("$uri", [
                'headers' => $this->options['headers'],
                'query' => [
                    'category_name' => $params['string'],
                    'tag' => strtolower(str_replace(' ', '', $params['pack']))
                ]
            ]),
            'byTitle'   => $this->client->getAsync("$uri", [
                'headers' => $this->options['headers'],
                'query' => [
                    'query' => $params['string'],
                    'tag' => strtolower(str_replace(' ', '', $params['pack']))
                ]
            ])
        ];

        $responses = Promise\Utils::settle($promises)->wait();

experimenta fazer dessa forma para ver se serve para vc e me da um feedback pra eu saber :)

-- eu estava olhando a documentação e me parece que a sua implementação deveria enviar as requisições de forma simultanea, o que muda de uma implementação para a outra deveria ser apenas que na primeira ela retorna um erro se uma delas falhar e a segunda ela continua executando todas as requisiões mesmo que alguma falhe... tem um código que eu implementei uma sequencia de mais de 10 requisições no media stream e a página demorava muito para carregar antes da implementação da promise! depois de implementar ficou bem rápido

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software