HTTP-Clients in PHP - vom fopen-Wrapper zur Symfony-Komponente

6a1345d8e6dd15b2c78eff0c331963b1?s=47 Denis Brumann
September 26, 2019

HTTP-Clients in PHP - vom fopen-Wrapper zur Symfony-Komponente

HTTP-Requests aus einer PHP-Anwendung zu verschicken, war früher kompliziert.
Von aufwendigem Stream-Handling über eine Vielzahl an Bibliotheken hin zu einem gemeinsamen Standard hat sich viel getan. In meinem Talk gebe ich einen kurzen Einblick in die Historie von HTTP-Clients, einen Überblick über den PSR-18 Standard hin zu Symfonys HttpClient-Komponente und welche Vorteile sie bietet.


Denis Brumann

September 26, 2019


  1. 3.

    3 HTTP-Requests in PHP eine kurze Geschichtsstunde By Copyright ©

    2005 David Monniaux - Own work, CC BY-SA 3.0,
  2. 20.
  3. 22.

    @dbrumann / 22 Library A Library B Httplug Httplug

    Your App Httplug Guzzle 6-Adapter Guzzle 5-Adapter
  4. 23.

    @dbrumann / 23 Encourage devs to depend on the

    HTTPlug interface instead of concrete clients. Provide good quality HTTP- related packages to the PHP community. Over time, make HTTPlug a PHP Standards Recommendation (PSR)
  5. 24.

    @dbrumann / 24 The goal of this PSR is

    to allow developers to create libraries decoupled from HTTP client implementations. This will make libraries more reusable as it reduces the number of dependencies and lowers the likelihood of version conflicts.
  6. 25.

    @dbrumann / 25 $request = new Request('GET', ''); use

    GuzzleHttp\Psr7\Request; use Psr\Http\Client\ClientInterface; $response = $client->sendRequest($request);
  7. 26.

    @dbrumann / 26 use Psr\Http\Client\ClientInterface; $response = $client->sendRequest($request); $request

    = $requestFactory->createRequest('GET', ''); use Psr\Http\Message\RequestFactoryInterface;
  8. 32.

    @dbrumann / 32 A Client must not treat a

    well-formed HTTP request or HTTP response as an error condition.
  9. 40.

    @dbrumann / 40 $response = $httpClient->request( 'GET', '', [

    // these values are automatically encoded // before including them in the URL 'query' => [ 'token' => '...', 'name' => '...', ], ] );
  10. 41.

    @dbrumann / 41 @throws TransportExceptionInterface When a network error

    occurs @throws RedirectionExceptionInterface On a 3xx when $throw is true and the "max_redirects" option has been reached @throws ClientExceptionInterface On a 4xx when $throw is true @throws ServerExceptionInterface On a 5xx when $throw is true
  11. 42.

    @dbrumann / 43 public function getHeaders(bool $throw = true):

    array; public function getContent(bool $throw = true): string; public function toArray(bool $throw = true): array;
  12. 51.

    @dbrumann / 52 <service id="psr18.http_client" class="Symfony\Component\HttpClient\Psr18Client" > <argument type="service"

    id="http_client" /> <argument type="service" id="Psr\Http\Message\ResponseFactoryInterface" on-invalid="ignore" /> <argument type="service" id="Psr\Http\Message\StreamFactoryInterface" on-invalid="ignore" /> </service>
  13. 52.

    @dbrumann / 53 T h e c o m

    p o n e n t i s b u i l t f o r m a x i m u m H T T P p e r f o r m a n c e . B y d e s i g n , i t i s c o m p a t i b l e w i t h H T T P / 2 a n d w i t h d o i n g c o n c u r r e n t a s y n c h r o n o u s s t r e a m e d a n d m u l t i p l e x e d r e q u e s t s / r e s p o n s e s . E v e n w h e n d o i n g re g u l a r s y n c h ro n o u s c a l l s , t h i s d e s i g n a l l o w s k e e p i n g c o n n e c t i o n s t o re m o t e h o s t s o p e n b e t w e e n re q u e s t s , i m p ro v i n g p e r f o r m a n c e b y s a v i n g re p e t i t i v e D N S re s o l u t i o n , S S L n e g o t i a t i o n , e t c . To l e v e r a g e a l l t h e s e d e s i g n b e n e f i t s , t h e c U R L e x t e n s i o n i s n e e d e d .