使用 PHP 是否可以进行异步 HTTP 请求?
我有一个PHP脚本,需要从远程服务器下载多个文件。目前,我只是有一个循环下载并使用cURL处理文件,这意味着在前一个文件完成之前,它不会开始下载一个文件 - 这大大增加了脚本运行时间。
是否可以启动 cURL 的多个实例,例如,同时异步下载这些文件,而无需等待前一个实例完成?如果是这样,如何做到这一点?
我有一个PHP脚本,需要从远程服务器下载多个文件。目前,我只是有一个循环下载并使用cURL处理文件,这意味着在前一个文件完成之前,它不会开始下载一个文件 - 这大大增加了脚本运行时间。
是否可以启动 cURL 的多个实例,例如,同时异步下载这些文件,而无需等待前一个实例完成?如果是这样,如何做到这一点?
看看卷曲容易。它支持并行或单个请求中的阻止和非阻止请求。此外,它是经过单元测试的,不像许多简单或有缺陷的库。
披露:我是这个库的作者。该库有自己的测试套件,所以我非常有信心它是健壮的。
另外,请查看下面的使用示例:
<?php
// We will download info about 2 YouTube videos:
// http://youtu.be/XmSdTa9kaiQ and
// http://youtu.be/6dC-sm5SWiU
// Init queue of requests
$queue = new cURL\RequestsQueue;
// Set default options for all requests in queue
$queue->getDefaultOptions()
->set(CURLOPT_TIMEOUT, 5)
->set(CURLOPT_RETURNTRANSFER, true);
// Set callback function to be executed when request will be completed
$queue->addListener('complete', function (cURL\Event $event) {
$response = $event->response;
$json = $response->getContent(); // Returns content of response
$feed = json_decode($json, true);
echo $feed['entry']['title']['$t'] . "\n";
});
$request = new cURL\Request('http://gdata.youtube.com/feeds/api/videos/XmSdTa9kaiQ?v=2&alt=json');
$queue->attach($request);
$request = new cURL\Request('http://gdata.youtube.com/feeds/api/videos/6dC-sm5SWiU?v=2&alt=json');
$queue->attach($request);
// Execute queue
$queue->send();
是的。
有多重请求PHP库(或参见:存档的Google代码项目)。它是一个多线程的 CURL 库。
作为另一种解决方案,您可以编写一个脚本,该脚本使用支持线程的语言(如Ruby或Python)来执行此操作。然后,只需使用PHP调用脚本即可。似乎相当简单。