Php 如何减少执行时间?

Php 如何减少执行时间?,php,facebook,facebook-graph-api,Php,Facebook,Facebook Graph Api,我有一个facebook应用程序,用户可以在一场篮球比赛上下注(猜猜胜利者、差距、mvp和最佳得分手) 我用一张桌子放游戏,一张桌子放用户ID,一张桌子放赌注 如果你猜对了获胜者,你得1分。如果你猜对了,你会得到5分。如果你猜对了mvp,你会得到3分,最高得分手也是如此 现在,我有了一个文件,其中包含所有用户及其观点: <table> <tr> <td></td> &l

我有一个facebook应用程序,用户可以在一场篮球比赛上下注(猜猜胜利者、差距、mvp和最佳得分手)

我用一张桌子放游戏,一张桌子放用户ID,一张桌子放赌注

如果你猜对了获胜者,你得1分。如果你猜对了,你会得到5分。如果你猜对了mvp,你会得到3分,最高得分手也是如此

现在,我有了一个文件,其中包含所有用户及其观点:

        <table>
        <tr>
            <td></td>
            <td>
                Name
            </td>
            <td>
                Points
            </td>
        </tr>
        <?php
            $selectusers = $db->query("SELECT * FROM `predictorusers`");
            $c = 0;
            while ($appuser = $db->fetchRows($selectusers))
            {
                try
                {
                    $profile = $facebook->api('/'.$appuser['userid']);
                } catch (FacebookApiException $e) {
                    continue;
                }
                $c++;

                $points = 0;

                $selectbets = $db->query("SELECT * FROM `predictor` WHERE `userid`='{$profile['id']}'");
                while ($bet = $db->fetchRows($selectbets))
                {
                    $selectgame = $db->query("SELECT * FROM `schedule` WHERE `id`='{$bet['gameid']}'");
                    $game = $db->fetchRows($selectgame);

                    if ($bet['winner'] == 1 && $game['homescore'] > $game['awayscore'])
                    {
                        $points = $points + 1;

                        if (($game['homescore'] - $game['awayscore']) == $bet['diff'])
                            $points = $points + 5;
                    }
                    elseif ($bet['winner'] == 2 && $game['awayscore'] > $game['homescore'])
                    {
                        $points = $points + 1;

                        if (($game['awayscore'] - $game['homescore']) == $bet['diff'])
                            $points = $points + 5;
                    }

                    $selectmvprkg = $db->query("SELECT MAX(`rkg`) FROM `boxscore` WHERE `game`='{$game['id']}'");
                    $mvprgk = $db->fetchRows($selectmvprkg);

                    $selectmvp = $db->query("SELECT * FROM `boxscore` WHERE `rkg`='{$mvprkg['rkg']}'");
                    while ($mvp = $db->countRows($selectmvp))
                    {
                        if ($mvp['player'] == $bet['mvp'])
                            $points = $points + 3;
                    }

                    $selecttopscorerpts = $db->query("SELECT MAX(`pts`) FROM `boxscore` WHERE `game`='{$game['id']}'");
                    $topscorerpts = $db->fetchRows($selecttopscorerpts);

                    $selecttopscorer = $db->query("SELECT * FROM `boxscore` WHERE `pts`='{$topscorerpts['pts']}'");
                    while ($topscorer = $db->fetchRows($selecttopscorer))
                    {
                        if ($topscorer['player'] == $bet['topscorer'])
                            $points = $points + 5;
                    }
                }
        ?>
        <tr>
            <td>
                <?php echo $c; ?>
            </td>
            <td>
                <?php echo $profile['name']; ?>
            </td>
            <td>
                <?php echo $points; ?>
            </td>
        </tr>
        <?php
            }
        ?>
    </table>

名称
要点
唯一的问题是,脚本需要30秒以上才能完全执行,因此服务器停止执行并发送错误:

致命错误:第37行*中的最大执行时间超过30秒

有人知道我该如何防止这种情况发生吗

编辑:

查看包含0个api调用的此文件:

        <table>
        <tr>
            <td></td>
            <td>
                Name
            </td>
            <td>
                Points
            </td>
        </tr>
        <?php
            $selectusers = $db->query("SELECT * FROM `predictorusers`");
            $c = 0;
            while ($appuser = $db->fetchRows($selectusers))
            {
                $c++;

                $points = 0;

                $selectbets = $db->query("SELECT * FROM `predictor` WHERE `userid`='{$appuser['userid']}'");
                while ($bet = $db->fetchRows($selectbets))
                {
                    $selectgame = $db->query("SELECT * FROM `schedule` WHERE `id`='{$bet['gameid']}'");
                    $game = $db->fetchRows($selectgame);

                    if ($bet['winner'] == 1 && $game['homescore'] > $game['awayscore'])
                    {
                        $points = $points + 1;

                        if (($game['homescore'] - $game['awayscore']) == $bet['diff'])
                            $points = $points + 5;
                    }
                    elseif ($bet['winner'] == 2 && $game['awayscore'] > $game['homescore'])
                    {
                        $points = $points + 1;

                        if (($game['awayscore'] - $game['homescore']) == $bet['diff'])
                            $points = $points + 5;
                    }

                    $selectmvprkg = $db->query("SELECT MAX(`rkg`) FROM `boxscore` WHERE `game`='{$game['id']}'");
                    $mvprgk = $db->fetchRows($selectmvprkg);

                    $selectmvp = $db->query("SELECT * FROM `boxscore` WHERE `rkg`='{$mvprkg['rkg']}'");
                    while ($mvp = $db->countRows($selectmvp))
                    {
                        if ($mvp['player'] == $bet['mvp'])
                            $points = $points + 3;
                    }

                    $selecttopscorerpts = $db->query("SELECT MAX(`pts`) FROM `boxscore` WHERE `game`='{$game['id']}'");
                    $topscorerpts = $db->fetchRows($selecttopscorerpts);

                    $selecttopscorer = $db->query("SELECT * FROM `boxscore` WHERE `pts`='{$topscorerpts['pts']}'");
                    while ($topscorer = $db->fetchRows($selecttopscorer))
                    {
                        if ($topscorer['player'] == $bet['topscorer'])
                            $points = $points + 5;
                    }
                }
        ?>
        <tr>
            <td>
                <?php echo $c; ?>
            </td>
            <td>
                <?php echo $app['userid']; ?>
            </td>
            <td>
                <?php echo $points; ?>
            </td>
        </tr>
        <?php
            }
        ?>
    </table>

名称
要点

同样的情况也会发生。

我建议以某种方式缓存API调用的结果,这样就不必在每次加载页面时为每个用户调用API

您可能还想研究一个问题—为结果集中的所有用户调用一个API要比为每个用户调用单个API快得多


一般来说,将查询嵌套在多个层次的循环中是个坏主意-尽量减少正在运行的查询总数。

嵌套查询的深度为3。代码中的嵌套查询总是一个危险信号(在极少数情况下是必要的)。对于predictor用户中的每个记录,您都在predictor中查询记录。然后,对于predictor中的每个查询,您都会根据schedule和boxscore运行查询(3次)

这就是你的问题所在,你有太多的查询在运行。您应该使用联接并将数据缩小到特定信息。看起来您正在查询您拥有的每一条数据。您可能可以将其归结为每个用户一个查询,甚至只需要一个带有userid过滤器的查询

  • 请不要使用
    选择*
    ,而是使用特定的列名
  • 请避免使用嵌套sql语句,方法是使用单个获取并将数据保存在数组中以进行遍历
  • 尝试使用XDebug Profiler来确定脚本的哪个部分需要更多的时间来加载
    更改了第18行:$profile=$facebook->api('/'.$appuser['userid'],数组('fields'=>'name');仍然需要很多时间。我还添加了设置时间限制(0);到页首。它永远不会结束!!!嘿,首先谢谢你的回答。其次,请看一下我的编辑。谢谢你!首先,您在boxscores mvprgk/mvprkg中有一个输入错误。第二,在一个查询中获得所有框分数:依次从boxscore组中选择game、MAX(rkg)MAX_rkg、MAX(pts)MAX_pts第三,您可以这样加入:SELECT*FROM predictor USERS join predictor USERS上的predictor.userid=predictor.userid加入predictor上的计划。gameid=schedule.id ORDER BY predictor USERUSERID