我们如何使 PHP 运行 中的多个 file_get_contents 更快?
How do we make multiple file_get_contents in PHP run faster?
我们正在构建一个执行重复 file_get_contents 的 API。
我有一个用户标识数组,file_get_contents()
的数量将按数组中内容的数量重复。我们将处理数千个请求。
function request($userid) {
global $access_token;
$url = 'https://<api-domain>'.$userid.'?access_token='.$access_token;
$response = file_get_contents($url);
return json_decode($response);
}
function loopUserIds($arrayUserIds) {
global $countFollowers;
$arrayAllUserIds = array();
foreach ($arrayUserIds as $userid) {
$followers = request($userid);
...
}
...
}
我担心的是获取所有内容需要时间。由于函数也会在循环中被调用。请告知我们如何才能使这个(许多 file_get_contents()
个请求)运行 更快?
如@HankyPanky 所述,您可以使用 curl_multi_exec()
同时执行多个并发请求。
这样的事情应该有所帮助:
function fetchAndProcessUrls(array $urls, callable $f) {
$multi = curl_multi_init();
$reqs = [];
foreach ($urls as $url) {
$req = curl_init();
curl_setopt($req, CURLOPT_URL, $url);
curl_setopt($req, CURLOPT_HEADER, 0);
curl_multi_add_handle($multi, $req);
$reqs[] = $req;
}
// While we're still active, execute curl
$active = null;
// Execute the handles
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi) != -1) {
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// Close the handles
foreach ($reqs as $req) {
$f(curl_multi_getcontent($req));
curl_multi_remove_handle($multi, $req);
}
curl_multi_close($multi);
}
你可以这样使用它:
$urlArray = [ 'http://www.example.com/' , 'http://www.example.com/', ... ];
fetchAndProcessUrls($urlArray, function($requestData) {
/* do stuff here */
// e.g.
$jsonData = json_decode($requestData, 1); //
});
当 curl_multi_exec 不可用时,您可以通过重用 $ch 而不是为每个文件创建一个新文件来提高性能,这将在从同一主机下载时重用连接。
我们正在构建一个执行重复 file_get_contents 的 API。
我有一个用户标识数组,file_get_contents()
的数量将按数组中内容的数量重复。我们将处理数千个请求。
function request($userid) {
global $access_token;
$url = 'https://<api-domain>'.$userid.'?access_token='.$access_token;
$response = file_get_contents($url);
return json_decode($response);
}
function loopUserIds($arrayUserIds) {
global $countFollowers;
$arrayAllUserIds = array();
foreach ($arrayUserIds as $userid) {
$followers = request($userid);
...
}
...
}
我担心的是获取所有内容需要时间。由于函数也会在循环中被调用。请告知我们如何才能使这个(许多 file_get_contents()
个请求)运行 更快?
如@HankyPanky 所述,您可以使用 curl_multi_exec()
同时执行多个并发请求。
这样的事情应该有所帮助:
function fetchAndProcessUrls(array $urls, callable $f) {
$multi = curl_multi_init();
$reqs = [];
foreach ($urls as $url) {
$req = curl_init();
curl_setopt($req, CURLOPT_URL, $url);
curl_setopt($req, CURLOPT_HEADER, 0);
curl_multi_add_handle($multi, $req);
$reqs[] = $req;
}
// While we're still active, execute curl
$active = null;
// Execute the handles
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi) != -1) {
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// Close the handles
foreach ($reqs as $req) {
$f(curl_multi_getcontent($req));
curl_multi_remove_handle($multi, $req);
}
curl_multi_close($multi);
}
你可以这样使用它:
$urlArray = [ 'http://www.example.com/' , 'http://www.example.com/', ... ];
fetchAndProcessUrls($urlArray, function($requestData) {
/* do stuff here */
// e.g.
$jsonData = json_decode($requestData, 1); //
});
当 curl_multi_exec 不可用时,您可以通过重用 $ch 而不是为每个文件创建一个新文件来提高性能,这将在从同一主机下载时重用连接。