Skip to content

wrap curl client (http client) for PHP 5.3; using php multi curl, parallel request and write asynchronous code

License

Notifications You must be signed in to change notification settings

KhristenkoYura/mcurl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

894eb86 · Jun 8, 2016

History

58 Commits
Mar 12, 2015
Jun 7, 2016
Jun 7, 2016
Apr 28, 2015
Jun 21, 2015
Jun 21, 2015
Oct 23, 2015
Jun 22, 2015

Repository files navigation

MCurl - simple, but functional wrapper for curl

Build Version License Downloads

Features:

  • PHP >= 5.3 (compatible up to version 7.0 && hhvm)
  • stable. Using many projects
  • fast request. Minimal overhead
  • run a query in a single line
  • parallel request (Multi request). Default enable parallel request
  • use async request
  • balancing requests
  • no callable

Install

The recommended way to install multi curl is through composer.

$ composer require khr/php-mcurl-client:3.*
{
    "require": {
        "khr/php-mcurl-client": "~3.0"
    }
}

Quick Start and Examples

Create

use MCurl\Client;
$client = new Client();

Simple request

echo $client->get('http://example.com');

Check error

$result = $client->get('http://example.com');
echo (!$result->hasError()
    ? 'Ok: ' . $result
    : 'Error: ' .$result->error . ' ('.$result->errorCode.')')
    , PHP_EOL;

Add curl options in request

echo $client->get('http://example.com', [CURLOPT_REFERER => 'http://example.net/']);

Post request

echo $client->post('http://example.com', ['post-key' => 'post-value'], [CURLOPT_REFERER => 'http://example.net/']);

Simple parallel request

// @var $results Result[]
$results = $client->get(['http://example.com', 'http://example.net']);
foreach($results as $result) {
    echo $result;
}

Parallel request

$urls = ['http://example.com', 'http://example.net', 'http://example.org'];
foreach($urls as $url) {
    $client->add([CURLOPT_URL => $url]);
}
// wait all request
// @var $results Result[]
$results = $client->all();

Parallel request; waiting only next result

$urls = ['http://example.com', 'http://example.net', 'http://example.org'];
foreach($urls as $url) {
    $client->add([CURLOPT_URL => $url]);
}
while($result = $client->next()) {
    echo $result;
}

Dynamic add request

while($result = $client->next()) {
    $urls = fun_get_urls_for_parse_result($result);
    foreach($urls as $url) {
        $client->add([CURLOPT_URL => $url]);
    }
    echo $result;
}

Non-blocking request; use async code; only run request and check done

while($client->run() || $client->has()) {
    while($client->has()) {
        // no blocking
        $result = $client->next();
        echo $result;
    }

    // more async code

    //end more async code
}

Use params

$result = $client->add([CURLOPT_URL => $url], ['id' => 7])->next();
echo $result->params['id']; // echo 7

Result

// @var $result Result
$result->body; // string: body result
$result->json; // object; @see json_encode
$result->getJson(true); // array; @see json_encode
$result->headers['content-type']; // use $client->enableHeaders();
$result->info; // @see curl_getinfo();
$result->info['total_time']; // 0.001

$result->hasError(); // not empty curl_error or http code >=400
$result->hasError('network'); // only not empty curl_error
$result->hasError('http'); // only http code >=400
$result->getError(); // return message error, if ->hasError();
$result->httpCode; // return 200

Config

Client::setOptions

This curl options add in all request

$client->setOptions([CURLOPT_REFERER => 'http://example.net/']);

Client::enableHeaders

Add headers in result

$client->enableHeaders();

Client::setMaxRequest

The maximum number of queries executed in parallel

$client->setMaxRequest(20); // set 20 parallel request

Client::setSleep

To balance the requests in the time interval using the method $client->setSleep. It will help you to avoid stress (on the sending server) for receiving dynamic content by adjusting the conversion rate in the interval. Example:

$client->setSleep (20, 1);

1 second will run no more than 20 queries.

For static content is recommended restrictions on download speeds, that would not score channel. Example:

//channel 10 Mb.
$client->setMaxRequest (123);
$client->setOptions([CURLOPT_MAX_RECV_SPEED_LARGE => (10 * 1024 ^ 3) / 123]);

Cookbook

Download file

$client->get('http://exmaple.com/image.jpg', [CURLOPT_FILE => fopen('/tmp/image.jpg', 'w')]);

Save memory

To reduce memory usage, you can write the query result in a temporary file.

$client->setStreamResult(Client::STREAM_FILE); // All Result write in tmp file.
/**
 * @see tests/ and source
 */

About

wrap curl client (http client) for PHP 5.3; using php multi curl, parallel request and write asynchronous code

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages