sngrl/mcurl

PHP 5.3+ 的 curl 客户端 (HTTP 客户端) 包装器;使用 php multi curl,并行请求和异步编写代码

3.1.0 2016-06-08 07:34 UTC

This package is auto-updated.

Last update: 2024-09-19 18:17:04 UTC


README

Build Version License Downloads

功能

  • PHP >= 5.3 (兼容到版本 7.0 && hhvm)
  • 稳定。被许多项目使用
  • 快速 请求。最小开销
  • 单行运行查询
  • 并行请求(多请求)。默认启用并行请求
  • 使用异步请求
  • 请求平衡
  • 不可调用

安装

推荐通过 composer 安装多 curl。

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

快速入门和示例

创建

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

简单请求

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

检查错误

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

在请求中添加 curl 选项

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

POST 请求

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

简单并行请求

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

并行请求

$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();

并行请求;只等待下一个结果

$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;
}

动态添加请求

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

非阻塞请求;使用异步代码;只运行请求并检查完成

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

    // more async code

    //end more async code
}

使用参数

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

结果

// @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

配置

Client::setOptions

此 curl 选项添加到所有请求中

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

Client::enableHeaders

在结果中添加标题

$client->enableHeaders();

Client::setMaxRequest

并行执行的查询最大数量

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

Client::setSleep

使用 $client->setSleep 方法在时间间隔内平衡请求。这可以帮助您通过调整间隔内的转换率来避免接收动态内容时的压力。示例

$client->setSleep (20, 1);

1 秒内最多运行 20 个查询。

对于静态内容,建议限制下载速度,这样就不会占用信道。示例

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

食谱

下载文件

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

节省内存

为了减少内存使用,您可以将查询结果写入临时文件。

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