Skip to content
Asynchronous HTTP client with promises.
PHP
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci
example
src
test/unit
.gitignore
.scrutinizer.yml
CONTRIBUTING.md
LICENCE
README.md
composer.json
composer.lock

README.md

Asynchronous HTTP client with promises.

Asynchronous HTTP client, PSR-7 compatible implementation of the Fetch Standard which defines requests, responses, and the process that binds them: fetching.

This repository provides a PHP-HTTP Client Implementation for standardised HTTP interoperability.

See also, the JavaScript implementation that ships as standard in all modern browsers.


Build status Code quality Code coverage Current version PHP.Gt/Fetch documentation

Example usage: compute multiple HTTP requests in parallel, using fetch

<?php
$http = new Gt\Fetch\Http();

// Rather than creating the request now, `fetch` returns a Promise, 
// for later resolution with the BodyResponse.
$http->fetch("http://example.com/api/something.json")
->then(function(BodyResponse $response) {
// The first Promise resolves as soon as a response is received, even before
// the body's content has completed downloading.
	if(!$response->ok) {
		echo "Looks like there was a problem. Status code: "
			. $response->getStatusCode() . PHP_EOL;
		return null;
	}

// Within this Promise callback, you have access to the body stream, but
// to access the contents of the whole body, return a new Promise here:
    return $response->json();
})
->then(function(Json $json) {
// The second Promise resolves once the whole body has completed downloading.
    echo "Got JSON result length "
    	. count($json->results)
    	. PHP_EOL;

// Notice that type-safe getters are available on all Json objects:
    echo "Name of first result: "
    	. $json->results[0]->getString("name")
    	. PHP_EOL;
});

// A third request is made here to show a different type of body response:
$http->fetch("http://example.com/something.jpg")
->then(function(BodyResponse $response) {
    return $response->blob();
})
->then(function($blob) {
    echo "Got JPG blob. Saving file." . PHP_EOL;
    file_put_contents("/tmp/something.jpg", $blob);
});

// Once all Promises are registered, all HTTP requests can be initiated in
// parallel, with the callback function triggered when they are all complete. 
$http->all()->then(function() {
    echo "All HTTP calls have completed!" . PHP_EOL;
});

Example usage: HTTPlug PHP-HTTP Client & Asynchronous Client

<?php
$http = new Gt\Fetch\Http();

$slowRequest = new Request("GET", "http://slow.example.com");
$fastRequest = new Request("GET", "http://fast.example.com");

// Send the slow request asynchronously (returns a Http\Promise)
$http->sendAsyncRequest($slowRequest)
->then(function(ResponseInterface $response) {
	echo $response->getBody();
});

// Perform fast request synchronously (block until response ready)
$response = $http->sendRequest($fastRequest);

// Wait for any asynchronous requests to be completed.
$http->wait();

For more extensive examples, check out the code in the example directory.

You can’t perform that action at this time.