asyncswarm / curl
cURL 的 PHP 包装器。支持并行和非阻塞请求。对于高速抓取,请参阅 stil/curl-robot。
1.2.7
2021-01-25 13:52 UTC
Requires
- symfony/event-dispatcher: ^5.1
Requires (Dev)
- phpunit/phpunit: ^6.1
This package is auto-updated.
Last update: 2024-09-25 21:58:19 UTC
README
目录
简介
描述
这是一个小巧但功能强大且健壮的库,可以加快处理速度。如果你厌倦了使用具有过程化接口的 PHP cURL 扩展,但又想保持对脚本执行的掌控——这是一个不错的选择!如果你需要在项目中实现高速抓取,你可能对 stil/curl-easy 扩展感兴趣 - stil/curl-robot。
主要功能
- 广泛进行单元测试。
- 轻量级库,具有适度的接口。它不是一站式库。
- 具有非常简单接口的并行/异步连接。
- 在运行时并行/附加/分离请求!
- 支持回调,因此你可以控制执行过程。
- 智能设置器作为 CURLOPT_* 常量的替代。
- 如果你了解 cURL php 扩展,你不需要从头开始学习
安装
要使用 cURL-PHP 库,你需要安装 "libcurl" 包。
使用以下命令将此库作为 Composer 包安装
composer require BearZp/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_* 错误代码。