【问题标题】:How do we make multiple file_get_contents in PHP run faster?我们如何让 PHP 中的多个 file_get_contents 运行得更快?
【发布时间】:2015-11-13 14:30:59
【问题描述】:

我们正在构建一个执行重复 file_get_contents 的 API。 我有一个用户 ID 数组,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() 请求)运行得更快?

【问题讨论】:

  • 并行运行它们;或者不要使用重复的 file_get_contents().... API 是否允许您在单个请求中组合多个用户 ID?
  • 使用数据库而不是文件?
  • @MarkBaker api 不允许在单个请求中使用多个用户 ID
  • @Hanky웃Panky 我会试试 curl-multi-exec ......感谢您的评论!

标签: php api loops file-get-contents


【解决方案1】:

正如@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 可以提供帮助...这是内置在 php 中的吗?还是需要安装?谢谢!
  • 这将通过 curl 进行异步请求。注意:我没有对代码进行太多测试,您可能需要进行一些调试,我没有时间。
【解决方案2】:

当 curl_multi_exec 不可用时,您可以通过重用 $ch 而不是为每个文件创建一个新文件来获得性能,这将在从同一主机下载时重用连接。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2018-08-23
    • 2021-05-11
    • 2017-08-28
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多