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