PHP code example of wp-php-toolkit / http-client
1. Go to this page and download the library: Download wp-php-toolkit/http-client library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
wp-php-toolkit / http-client example snippets
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$client = new Client();
$stream = $client->fetch( new Request( 'https://example.com/' ) );
$response = $stream->await_response();
echo "status: " . $response->status_code . "\n";
echo "first 80 bytes: " . substr( $stream->consume_all(), 0, 80 ) . "\n";
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
use WordPress\ByteStream\MemoryPipe;
$payload = http_build_query(
array(
'title' => 'Hello',
'tags' => 'http,php',
),
'',
'&'
);
$client = new Client();
$request = new Request( 'https://httpbin.org/post', array(
'method' => 'POST',
'headers' => array(
'content-type' => 'application/x-www-form-urlencoded',
'content-length' => (string) strlen( $payload ),
),
'body_stream' => new MemoryPipe( $payload ),
) );
$response = $client->fetch( $request )->json();
echo "Server saw form title: " . $response['form']['title'] . "\n";
WordPress\ByteStream\MemoryPipe;
use WordPress\HttpClient\Request;
$body = new MemoryPipe( json_encode( array(
'title' => 'Hello',
'tags' => array( 'docs', 'php' ),
) ) );
$body->close_writing();
$request = new Request( 'https://user:[email protected] /posts', array(
'method' => 'POST',
'headers' => array( 'content-type' => 'application/json' ),
'body_stream' => $body,
) );
echo $request->method . ' ' . $request->url . "\n";
echo "content-type: " . $request->get_header( 'content-type' ) . "\n";
echo "content-length: " . $request->get_header( 'content-length' ) . "\n";
echo "authorization: " . substr( $request->get_header( 'authorization' ), 0, 10 ) . "...\n";
WordPress\HttpClient\Request;
use WordPress\HttpClient\Response;
$request = new Request( 'https://api.example.test/posts/42' );
$raw = "HTTP/1.1 201 Created\r\n"
. "Content-Type: application/json\r\n"
. "Location: /posts/42\r\n"
. "Content-Length: 27\r\n\r\n";
$response = Response::from_http_headers( $raw, $request );
echo "status: " . $response->status_code . ' ' . $response->get_reason_phrase() . "\n";
echo "ok: " . ( $response->ok() ? 'yes' : 'no' ) . "\n";
echo "type: " . $response->get_header( 'CONTENT-TYPE' ) . "\n";
echo "size: " . $response->total_bytes . " bytes\n";
WordPress\HttpClient\Client;
$default = new Client(); // Same as array( 'transport' => 'auto' ).
$portable = new Client( array(
'transport' => 'sockets',
) );
if ( extension_loaded( 'curl' ) ) {
$curl = new Client( array(
'transport' => 'curl',
) );
}
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$client = new Client();
$request = new Request( 'https://httpbin.org/redirect-to?url=https://example.com/' );
$stream = $client->fetch( $request );
$response = $stream->await_response();
$stream->consume_all();
$final = $request->latest_redirect();
echo "original: " . $request->url . "\n";
echo "final: " . $final->url . "\n";
echo "status: " . $response->status_code . "\n";
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$cache_dir = sys_get_temp_dir() . '/http-cache-' . uniqid();
mkdir( $cache_dir );
$client = new Client( array( 'cache_dir' => $cache_dir ) );
$url = 'https://httpbin.org/cache/60';
for ( $i = 1; $i <= 2; $i++ ) {
$stream = $client->fetch( new Request( $url ) );
$response = $stream->await_response();
$body = $stream->consume_all();
echo "request {$i}: HTTP " . $response->status_code . ', body=' . strlen( $body ) . " bytes\n";
}
echo "cache files: " . count( glob( $cache_dir . '/*' ) ) . "\n";
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$client = new Client( array( 'timeout_ms' => 5000 ) );
$client->enqueue( array(
new Request( 'https://example.com/', array( 'method' => 'HEAD' ) ),
new Request( 'https://example.invalid/missing' ),
) );
while ( $client->await_next_event() ) {
$request = $client->get_request();
$event = $client->get_event();
if ( Client::EVENT_GOT_HEADERS === $event ) {
echo "ok: " . $request->url . " HTTP " . $request->response->status_code . "\n";
} elseif ( Client::EVENT_FAILED === $event ) {
echo "failed: " . $request->url . "\n";
} elseif ( Client::EVENT_FINISHED === $event ) {
echo "finished: " . $request->url . "\n";
}
}
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$url = 'https://raw.githubusercontent.com/WordPress/php-toolkit/trunk/components/Zip/Tests/fixtures/childrens-literature.zip';
$dest = sys_get_temp_dir() . '/progress-' . uniqid() . '.zip';
$client = new Client();
$request = new Request( $url );
$client->enqueue( array( $request ) );
$downloaded = 0;
$last_step = -1;
@unlink( $dest );
while ( $client->await_next_event() ) {
$event = $client->get_event();
$request = $client->get_request();
if ( Client::EVENT_GOT_HEADERS === $event ) {
echo "status: " . $request->response->status_code . "\n";
continue;
}
if ( Client::EVENT_BODY_CHUNK_AVAILABLE === $event ) {
$chunk = $client->get_response_body_chunk();
$downloaded += strlen( $chunk );
file_put_contents( $dest, $chunk, FILE_APPEND );
$total = $request->response->total_bytes;
if ( $total ) {
$step = min( 100, (int) floor( $downloaded / $total * 100 ) );
if ( $step >= $last_step + 25 || 100 === $step ) {
echo "progress: {$step}% ({$downloaded}/{$total} bytes)\n";
$last_step = $step;
}
} else {
echo "downloaded: {$downloaded} bytes\n";
}
continue;
}
if ( Client::EVENT_FINISHED === $event ) {
echo "saved: {$dest}\n";
} elseif ( Client::EVENT_FAILED === $event ) {
echo "failed: " . $request->error->message . "\n";
}
}
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$urls = array();
for ( $i = 1; $i <= 25; $i++ ) {
$urls[] = 'https://example.com/?request=' . $i;
}
$client = new Client( array( 'concurrency' => 10 ) );
$pending = $urls;
$active = array();
$done = 0;
$enqueue_next = function () use ( &$pending, &$active, $client ) {
if ( ! $pending ) {
return;
}
$url = array_shift( $pending );
$request = new Request( $url, array( 'method' => 'HEAD' ) );
$active[ $request->id ] = $request;
$client->enqueue( array( $request ) );
};
for ( $i = 0; $i < 10; $i++ ) {
$enqueue_next();
}
while ( $active && $client->await_next_event() ) {
$request = $client->get_request();
$event = $client->get_event();
if ( Client::EVENT_GOT_HEADERS === $event ) {
echo "headers {$request->id}: " . $request->response->status_code . "\n";
continue;
}
if ( Client::EVENT_FINISHED === $event || Client::EVENT_FAILED === $event ) {
unset( $active[ $request->id ] );
$done++;
echo "finished {$done}/25, active=" . count( $active ) . "\n";
$enqueue_next();
}
}
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$url = 'https://raw.githubusercontent.com/WordPress/php-toolkit/trunk/components/Zip/Tests/fixtures/childrens-literature.zip';
$dest = sys_get_temp_dir() . '/resume-' . uniqid() . '.zip';
$client = new Client();
// Simulate an interrupted first attempt by downloading only the first 32 KB.
$first = new Request( $url, array(
'headers' => array( 'range' => 'bytes=0-32767' ),
) );
$stream = $client->fetch( $first );
$response = $stream->await_response();
file_put_contents( $dest, $stream->consume_all() );
if ( 206 !== $response->status_code ) {
echo "Server did not honor Range; start over with a full download.\n";
exit;
}
$downloaded = filesize( $dest );
echo "partial file: {$downloaded} bytes\n";
$resume = new Request( $url, array(
'headers' => array( 'range' => 'bytes=' . $downloaded . '-' ),
) );
$stream = $client->fetch( $resume );
$response = $stream->await_response();
if ( 206 !== $response->status_code ) {
echo "Server did not resume; discard partial file and retry from byte 0.\n";
exit;
}
while ( ! $stream->reached_end_of_data() ) {
$n = $stream->pull( 8192 );
if ( 0 === $n ) {
break;
}
file_put_contents( $dest, $stream->consume( $n ), FILE_APPEND );
}
echo "complete file: " . filesize( $dest ) . " bytes\n";
echo "saved: {$dest}\n";
WordPress\HttpClient\Client;
use WordPress\HttpClient\ByteStream\SeekableRequestReadStream;
use WordPress\HttpClient\Request;
use WordPress\Filesystem\LocalFilesystem;
use WordPress\Zip\ZipFilesystem;
use function WordPress\Filesystem\copy_between_filesystems;
use function WordPress\Filesystem\ls_recursive;
$url = 'https://raw.githubusercontent.com/WordPress/php-toolkit/trunk/components/Zip/Tests/fixtures/childrens-literature.zip';
$root = sys_get_temp_dir() . '/remote-zip-' . uniqid();
mkdir( $root );
$client = new Client();
$reader = new SeekableRequestReadStream(
new Request( $url ),
array( 'client' => $client )
);
$response = $reader->await_response();
if ( ! $response->ok() ) {
echo "HTTP " . $response->status_code . "\n";
exit;
}
$zip = ZipFilesystem::create( $reader );
$local = LocalFilesystem::create( $root );
copy_between_filesystems( array(
'source_filesystem' => $zip,
'source_path' => '/',
'target_filesystem' => $local,
'target_path' => '/',
) );
$tree = ls_recursive( $local, '/' );
$files = 0;
array_walk_recursive( $tree, function ( $value, $key ) use ( &$files ) {
if ( 'type' === $key && 'file' === $value ) {
$files++;
}
} );
echo "extracted {$files} files\n";
echo "root: {$root}\n";
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$urls = array(
'https://wordpress.org/',
'https://make.wordpress.org/',
'https://developer.wordpress.org/',
);
$client = new Client();
$client->enqueue( array_map( function ( $url ) {
return new Request( $url, array( 'method' => 'HEAD' ) );
}, $urls ) );
$results = array();
while ( $client->await_next_event() ) {
$request = $client->get_request();
if ( Client::EVENT_GOT_HEADERS === $client->get_event() ) {
$results[ $request->url ] = $request->response->status_code;
} elseif ( Client::EVENT_FAILED === $client->get_event() ) {
$results[ $request->url ] = 'ERR ' . $request->error->message;
}
}
foreach ( $results as $url => $status ) {
printf( "%-40s %s\n", $url, $status );
}
WordPress\HttpClient\Client;
use WordPress\HttpClient\Request;
$dest = sys_get_temp_dir() . '/wp-readme.html';
$client = new Client();
$client->enqueue( array( new Request( 'https://wordpress.org/' ) ) );
$bytes = 0;
@unlink( $dest );
while ( $client->await_next_event() ) {
switch ( $client->get_event() ) {
case Client::EVENT_BODY_CHUNK_AVAILABLE:
$chunk = $client->get_response_body_chunk();
$bytes += strlen( $chunk );
file_put_contents( $dest, $chunk, FILE_APPEND );
break;
case Client::EVENT_FINISHED:
echo "Wrote {$bytes} bytes to {$dest}\n";
break;
}
}
echo "Peak memory: " . round( memory_get_peak_usage( true ) / 1024 / 1024, 2 ) . " MB\n";