stil / curl-easy
cURL 的 PHP 封装库。支持并行和非阻塞请求。对于高速爬取,请查看 stil/curl-robot。
v1.2.1
2017-05-20 15:13 UTC
Requires
- symfony/event-dispatcher: ^3.2
Requires (Dev)
- phpunit/phpunit: ^6.1
README
目录
介绍
描述
这是一个小巧但强大且稳健的库,可以加快事务处理速度。如果你厌倦了使用 PHP cURL 扩展及其过程式接口,但又想保持对脚本执行的掌控 - 这是个不错的选择!如果你需要在项目中实现高速爬取,你可能对 stil/curl-easy 扩展感兴趣 - stil/curl-robot。
主要功能
- 广泛单元测试。
- 轻量级库,具有适度的接口。它不是一站式库。
- 具有非常简单接口的并行/异步连接。
- 在运行时并行/分离请求!
- 支持回调,因此你可以控制执行过程。
- 智能设置器作为 CURLOPT_* 常量的替代。
- 如果你熟悉 cURL PHP 扩展,你无需从头学习
安装
要使用 cURL-PHP 库,您需要安装 "libcurl" 包。
使用以下命令将此库作为 Composer 包安装
composer require stil/curl-easy
示例
单个阻塞请求
<?php // We will check current Bitcoin price via API. $request = new \cURL\Request('https://bitpay.com/rates/USD'); $request->getOptions() ->set(CURLOPT_TIMEOUT, 5) ->set(CURLOPT_RETURNTRANSFER, true); $response = $request->send(); $feed = json_decode($response->getContent(), true); echo "Current Bitcoin price: " . $feed['data']['rate'] . " " . $feed['data']['code'] . "\n";
上面的示例将输出
Current Bitcoin price: 1999.97 USD
单个非阻塞请求
<?php // We will check current Bitcoin price via API. $request = new \cURL\Request('https://bitpay.com/rates/USD'); $request->getOptions() ->set(CURLOPT_TIMEOUT, 5) ->set(CURLOPT_RETURNTRANSFER, true); $request->addListener('complete', function (\cURL\Event $event) { $response = $event->response; $feed = json_decode($response->getContent(), true); echo "\nCurrent Bitcoin price: " . $feed['data']['rate'] . " " . $feed['data']['code'] . "\n"; }); while ($request->socketPerform()) { usleep(1000); echo '*'; }
上面的示例将输出
********************
Current Bitcoin price: 1997.48 USD
并行请求
<?php // We will download Bitcoin rates for both USD and EUR in parallel. // Init requests queue. $queue = new \cURL\RequestsQueue; // Set default options for all requests in queue. $queue->getDefaultOptions() ->set(CURLOPT_TIMEOUT, 5) ->set(CURLOPT_RETURNTRANSFER, true); // Set function to execute when request is complete. $queue->addListener('complete', function (\cURL\Event $event) { $response = $event->response; $json = $response->getContent(); // Returns content of response $feed = json_decode($json, true); echo "Current Bitcoin price: " . $feed['data']['rate'] . " " . $feed['data']['code'] . "\n"; }); $request = new \cURL\Request('https://bitpay.com/rates/USD'); // Add request to queue $queue->attach($request); $request = new \cURL\Request('https://bitpay.com/rates/EUR'); $queue->attach($request); // Execute queue $timeStart = microtime(true); $queue->send(); $elapsedMs = (microtime(true) - $timeStart) * 1000; echo 'Elapsed time: ' . round($elapsedMs) . " ms\n";
上面的示例将输出
Current Bitcoin price: 1772.850062 EUR
Current Bitcoin price: 1987.01 USD
Elapsed time: 284 ms
并行非阻塞请求
<?php // We will download Bitcoin rates for both USD and EUR in parallel. // Init requests queue. $queue = new \cURL\RequestsQueue; // Set default options for all requests in queue. $queue->getDefaultOptions() ->set(CURLOPT_TIMEOUT, 5) ->set(CURLOPT_RETURNTRANSFER, true); // Set function to execute when request is complete. $queue->addListener('complete', function (\cURL\Event $event) { $response = $event->response; $json = $response->getContent(); // Returns content of response $feed = json_decode($json, true); echo "\nCurrent Bitcoin price: " . $feed['data']['rate'] . " " . $feed['data']['code'] . "\n"; }); $request = new \cURL\Request('https://bitpay.com/rates/USD'); // Add request to queue $queue->attach($request); $request = new \cURL\Request('https://bitpay.com/rates/EUR'); $queue->attach($request); // Execute queue $timeStart = microtime(true); while ($queue->socketPerform()) { usleep(1000); echo '*'; } $elapsedMs = (microtime(true) - $timeStart) * 1000; echo 'Elapsed time: ' . round($elapsedMs) . " ms\n";
上面的示例将输出类似的内容
*****************************************************************************************************************************************************
Current Bitcoin price: 1772.145208 EUR
************************************************************************
Current Bitcoin price: 1986.22 USD
Elapsed time: 374 ms
在同时执行最多 2 个请求的情况下处理多个请求的队列
$requests = []; $currencies = ['USD', 'EUR', 'JPY', 'CNY']; foreach ($currencies as $code) { $requests[] = new \cURL\Request('https://bitpay.com/rates/' . $code); } $queue = new \cURL\RequestsQueue; $queue ->getDefaultOptions() ->set(CURLOPT_RETURNTRANSFER, true); $queue->addListener('complete', function (\cURL\Event $event) use (&$requests) { $response = $event->response; $json = $response->getContent(); // Returns content of response $feed = json_decode($json, true); echo "Current Bitcoin price: " . $feed['data']['rate'] . " " . $feed['data']['code'] . "\n"; if ($next = array_pop($requests)) { $event->queue->attach($next); } }); $queue->attach(array_pop($requests)); $queue->attach(array_pop($requests)); $queue->send();
上面的示例将输出类似的内容
Current Bitcoin price: 220861.025 JPY
Current Bitcoin price: 13667.81675 CNY
Current Bitcoin price: 1771.0567 EUR
Current Bitcoin price: 1985 USD
智能选项设置
将 CURLOPT_*
替换为 set*()
,你将获得方法名。示例
$opts = new \cURL\Options; $opts->set(CURLOPT_URL, $url); // it is equivalent to // $opts->setUrl($url); $opts->set(CURLOPT_RETURNTRANSFER, true); // it is equivalent to // $opts->setReturnTransfer(true); // or // $opts->setReTURNTranSFER(true); // character case does not matter $opts->set(CURLOPT_TIMEOUT, 5); // it is equivalent to // $opts->setTimeout(5); // then you can assign options to Request $request = new \cURL\Request; $request->setOptions($opts); // or make it default in RequestsQueue $queue = new \cURL\RequestsQueue; $queue->setDefaultOptions($opts);
错误处理
你可以在 Response 类中访问 cURL 错误代码。示例
$request = new \cURL\Request('http://non-existsing-page/'); $response = $request->send(); if ($response->hasError()) { $error = $response->getError(); echo 'Error code: ' . $error->getCode() . "\n"; echo 'Message: "' . $error->getMessage() . '"' . "\n"; }
可能上面的示例将输出
Error code: 6
Message: "Could not resolve host: non-existsing-page; Host not found"
你可以在这里找到所有 CURLE_* 错误代码。