php - 加速 php api 调用

标签 php mysql api curl-multi

<分区>

大家好。所以我需要通过 API 调用检查数据库中的大量行。我设法做到了,但速度很慢。

以下是我的代码执行的步骤:

1.) 我从本地数据库中选择唯一标识符。

2.) 我通过 curl_multi 在远程数据库上检查它们(当时是 100 个)。

3.) 根据状态代码更新数据库中的行。

4.) 重复前 3 个步骤,直到检查完所有行。

我怎样才能加快这个过程?此时检查 600 行需要一分多钟。

    foreach ($data as $d){
    $kupci = [];
    $upit = "SELECT * FROM database_table WHERE provjeren IS NULL LIMIT 100";
    $result = $conn->query($upit)
    while ($r = mysqli_fetch_assoc($result)) {
        $kupci[] = $r;
    }
    $node_count = count($kupci);
    $curl_arr = array();
    for ($i = 0; $i < $node_count; $i++) {
        $ID = str_replace(" ","%20",$kupci[$i]['Customer_ID']) ;
        $url = "someapiurl/$ID";
        $curl_arr[$i] = curl_init($url);
        curl_setopt($curl_arr[$i], CURLOPT_HTTPHEADER, array("Authorization: Bearer"));
        curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl_arr[$i], CURLOPT_ENCODING,  '');
    }
    $master = curl_multi_init();
    for ($i = 0; $i < $node_count; $i++) {
        curl_multi_add_handle($master, $curl_arr[$i]);
    }
    do {
        curl_multi_exec($master, $running);
    } while ($running > 0);
    for ($i = 0; $i < $node_count; $i++) {
        $results = curl_multi_getcontent($curl_arr[$i]);
        $link = curl_getinfo($curl_arr[$i], CURLINFO_EFFECTIVE_URL);
        $id = substr($link, strrpos($link, '/') + 1);
        $statusCode = curl_getinfo($curl_arr[$i], CURLINFO_RESPONSE_CODE);
        if ($statusCode == 204) {
            $conn->query("UPDATE database_table SET provjeren = 1, prigovor = 1, datum = now() WHERE Customer_ID = '$id'");
        } elseif ($statusCode == 404) {
            $conn->query("UPDATE database_table SET provjeren = 1, prigovor = 0, datum = now() WHERE Customer_ID = '$id'");
        }elseif ($statusCode == 429){
            echo "Previše";
        }elseif ($statusCode == 200){
            $conn->query("UPDATE database_table SET provjeren = 1, prigovor = 2, datum = now() WHERE Customer_ID = '$id'");
        }
        curl_multi_remove_handle($master, $curl_arr[$i]);
        curl_close($curl_arr[$i]);
    }
    curl_multi_close($master);
}

编辑: 我尝试了 Rolling-Curl,得到了相同的结果。所以我的结论是目标服务器很慢,这是我的瓶颈。在我的目标服务器上测试了 500 个请求需要 36 秒才能完成,而在 Google 服务器上只需要 2 秒就可以完成。

最佳答案

您是否尝试过通过新线程运行 HTTP API 调用。

试试这个 PHP 项目:https://github.com/petewarden/ParallelCurl

根据您需要的文档:

  • 使用最大值创建一个并行 cURL 对象。同时 HTTP 连接
  • 当来自 API 的响应到达时编写一个处理程序
  • 在迭代数据库中的行时编写 cURL 调用

如果没有帮助,请尝试测量最耗时的内容(数据库获取、API 调用、数据库更新)

关于php - 加速 php api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52962805/

相关文章:

php - 每次都请求 facebook 权限

php - 使用php将事件插入谷歌日历

php - PHP 重定向后检索 $_SESSION 值

javascript - Node.js 中的 JSON.parse 问题

php - 在本地运行 Web 应用程序

php - 克隆表行在 php 中失败,但通过 sql shell 成功

php - 请比较php中的两个变量

mysql - 如何根据mysql中的分数添加排名

angular - 从前端访问azure databricks Rest api时出现CORS错误

javascript - 如何为我页面的 Javascript 提供 Greasemonkey 的 GM_xmlhttpRequest 的有限接口(interface)?