【问题标题】:Handling hundreds of API requests in one time一次处理数百个 API 请求
【发布时间】:2020-02-04 22:39:51
【问题描述】:

我正在尝试制作一个用户仪表板,它将生成我所有 37 个由不同玩家玩过的游戏帐户的报告。因此,对于每个 i 抓取 数据,然后计算它产生的奖励量。但为此我需要执行数百个 api 请求,并且由于 max_exec_time 限制为 30 秒,它给了我一个致命错误。我也将时间重置为 3000,但它在 2400 左右(40 分钟)内完成。我可以在每个帐户的 10 分钟内用笔计算。所以,我需要一种快速的方法来进行 api 调用。谢谢



首先,它会在一周内获得用户收集的卡片(通常是 35-40),然后对于每张卡片,它会检查卡片的稀有度和箔纸(黄金或普通)。如果它是黄金,则保存到 $isgold 数组。但我还是只检查了黄金。有 40 个电话,我总共有 37 个帐户。所以,当我点击获取报告时,它必须进行大约 1300 次 API 调用,这似乎不太好。还有其他更好的方法吗...??

如果有,请分享。

这是我的 php 函数

<?php
$json = json_decode(file_get_contents("https://steemmonsters.com/cards/collection/iampolite"), 1);
    $cards = $json['cards'];
    $usercards = array();
    $isgold = array();
    
    foreach ($cards as $card) {
        if($card['player'] == 'iampolite' ) {
            $usercards[] = $card;
            
            foreach($usercards as $key=>$usercard) {
                $uid = $usercard['uid'];
                $json = json_decode(file_get_contents("https://steemmonsters.com/cards/find?ids=$uid"), 1);
                $data = $json['0']['gold'];
                if($data == true){
                    $isgold[] = $uid;
                }
            }
        }
    }
print_r(count($isgold));
echo "<br><br>";
print_r($usercards);
?>

【问题讨论】:

  • 听起来 API 限制了你的速率。
  • 您是否有可能发出重复的/cards/find?ids=$ui 请求?您可能会从缓存机制中受益。

标签: php json performance api


【解决方案1】:

简而言之:

创建一个类,首先查看对象(带有 uid)是否已经存在,例如作为 Json 文件。如果是这样,请阅读此内容。如果没有,则从 API 中读取对象并将其保存为带有 uid 的 Json 文件。

但您也可以将所有对象收集到一个数组中并将它们保存在一个 Json 文件中。然后你总是先读取这个 Json 文件,并在必要时使用不存在的 uid 对象对其进行扩展。

【讨论】:

    【解决方案2】:

    您在第一次通话中获得了信息。

    https://steemmonsters.com/cards/collection/iampolite

    {
      "player": "iampolite",
      "cards": [
        {
          "player": "davemccoy",
          "uid": "G1-1-I0SED3J72O",
          "card_detail_id": 1,
          "xp": 200,
          "gold": true,
          "edition": 1,
          "market_id": null,
          "buy_price": null,
          "last_used_block": 40381744,
          "last_used_player": "iampolite",
          "last_used_date": "2020-01-30T13:14:06.000Z",
          "last_transferred_block": null,
          "last_transferred_date": null,
          "alpha_xp": null,
          "delegated_to": "iampolite",
          "delegation_tx": "e38c7919f1e4cd6537b21323e9d8efd3d500c8b9",
          "skin": null,
          "level": 4
        },
        {
          "player": "davemccoy",
          "uid": "G1-2-ICCA0EHX8G",
          "card_detail_id": 2,
          "xp": 200,
          "gold": true,
          "edition": 1,
          "market_id": null,
          "buy_price": null,
          "last_used_block": 40381744,
          "last_used_player": "iampolite",
          "last_used_date": "2020-01-30T13:14:06.000Z",
          "last_transferred_block": null,
          "last_transferred_date": null,
          "alpha_xp": null,
          "delegated_to": "iampolite",
          "delegation_tx": "e38c7919f1e4cd6537b21323e9d8efd3d500c8b9",
          "skin": null,
          "level": 4
        },
        {
          "player": "davemccoy",
          "uid": "G1-3-REN59OW45C",
          "card_detail_id": 3,
          "xp": 200,
          "gold": true,
          "edition": 1,
          "market_id": null,
          "buy_price": null,
          "last_used_block": 40380988,
          "last_used_player": "iampolite",
          "last_used_date": "2020-01-30T12:36:06.000Z",
          "last_transferred_block": null,
          "last_transferred_date": null,
          "alpha_xp": null,
          "delegated_to": "iampolite",
          "delegation_tx": "e38c7919f1e4cd6537b21323e9d8efd3d500c8b9",
          "skin": null,
          "level": 4
        },...
    

    这样您就可以直接获取信息:

    <?php
    $json = json_decode(file_get_contents("https://steemmonsters.com/cards/collection/iampolite"), 1);
        $cards = $json['cards'];
        $usercards = array();
        $isgold = array();
    
        foreach ($cards as $card) {
            if($card['player'] == 'iampolite' ) {
                $usercards[] = $card;
    
                foreach($usercards as $key=>$usercard) {
                    $uid = $usercard['uid'];
    
                    if($usercard['gold'] == true){
                        $isgold[] = $uid;
                    }
                }
            }
        }
    print_r(count($isgold));
    echo "<br><br>";
    print_r($usercards);
    ?>
    

    【讨论】:

    • 是的,但我正在寻找稀有而不是黄金。正如我所说,我没有将稀有度包括在黄金中,只是它太多了。
    • 我会说@Scuzzy 是对的。您应该在数据库中缓存或插入信息
    • 这可能很愚蠢,但你认为将数据保存在数据库中,然后为每个数据调用。
      它肯定会给出结果,但时间呢?你能建议一些东西吗?感谢您的帮助
    猜你喜欢
    • 2019-03-30
    • 2020-07-12
    • 2019-05-11
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2017-03-17
    • 2012-03-18
    • 2021-02-11
    相关资源
    最近更新 更多