tutorial guzzlehttp example php asynchronous guzzle6

php - guzzlehttp - ¿Cuál es el punto de las promesas asincrónicas de Guzzle?



install guzzle windows (2)

Con Guzzle, ¿las promesas proporcionan alguna utilidad real? Parece que hay que llamar a esperar (). El siguiente código (de los documentos) parece no hacer nada por sí mismo:

$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 debe llamar a $ promesa-> esperar () para hacer la solicitud, ¿cuál es el punto de una promesa? ¿Cómo es esto realmente diferente a:

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

Lo mejor que puedo decir es que el único beneficio es su enfoque conveniente para definir las devoluciones de llamadas de solicitud exitosas y fallidas. Incluso la sección de documentos sobre la realización de solicitudes múltiples tiene el siguiente código, que parece bloquear y ejecutar todas las solicitudes ... quizás al mismo tiempo. ¿Es esto todo lo que debería esperar?

// Wait on all of the requests to complete. $results = Promise/unwrap($promises);


Async requiere un poco de pensamiento inverso.

Este es un escenario que puede surgir que puede ser útil: dada una API ( http://ipsum.org/ ), se requiere que obtenga una lista de datos (por ID) en su ruta (o script): si lo hace De manera procedimental, tendrá que recorrer cada solicitud y esperar hasta que todo vuelva.

Con Guzzle Promise, puede "prepararse" para la respuesta y luego, cuando vuelve, puede procesarla. La ventaja de esto es que en lugar de N solicita x T tiempo de solicitud para ejecutar su script, la latencia es ahora CEIL (el tiempo de respuesta más lento de todas las respuestas recibidas) mientras "espera" a que TODAS las respuestas regresen, pero son enviado en paralelo en su lugar.

En otras palabras, está enviando una solicitud en paralelo en lugar de en serie para que espere la respuesta a su regreso O bien, puede realizar una ejecución previa de la llamada de enrollamiento primero, y luego hacer una configuración para "ok mientras espero el retorno, déjeme preparar la respuesta ".

La parte posterior requerirá una reestructuración, ya que estamos acostumbrados a "ir a buscar, esperar, luego con la respuesta, podemos operar la respuesta".


Me estoy arriesgando, pero por lo que he leído ...

Si bien PHP no puede realizar un procesamiento asíncrono, puede abrir varias transmisiones y manejar su entrada sin bloquear. Entonces, en su ejemplo con una sola conexión, sí, no hay ningún punto / beneficio.

Pero digamos que querías cargar 5 recursos. El uso de métodos asíncronos podría permitir que estos recursos se carguen esencialmente en paralelo, en lugar de solo iniciar el segundo cuando el primero se haya cargado.

Y Guzzle proporciona formas de manejar casos de uso como "después de que todos se cargaron correctamente y luego ..." o "después de que todos se cargaron o fallaron ...".

Así que creo que debería permitir un procesamiento más rápido cuando se manejan varias solicitudes que pueden suceder simultáneamente.