PHP:for循环使VPS上的页面加载速度非常慢

时间:2014-08-22 14:20:13

标签: php mysql

我是php的新手,所以我很难看到我在这个代码出错的地方。我试图拉出一组4个随机ID,以在页面上显示他们的图像和链接。在我的本地开发环境中运行相同的代码工作正常,响应很快。但是,在我的VPS上,页面加载需要15-30秒。我设法通过将整个块移出并且页面再次快速加载来将问题隔离到此循环。

<?php
$alreadypicked = array();
for ($i = 1; $i <= 4; $i + 0) {
    $randchoice = getinfoForRandom();
    $info = pullrandinfo($randchoice);
    if (!in_array($randchoice, $alreadypicked)) {?>
            <div class="col-sm-3 col-xs-6">
                <a href="<?php echo 'recipes.php?id=' . $info[0]['id'];?>">
                    <img class="img-responsive portfolio-item" src="<?php echo 'images/' . $info[0]['filename'];?>" alt="<?php echo $info[0]['name'];?>">
                </a>
            </div>
        <?php
        array_push($alreadypicked, $randchoice);
        } else {
            $i = $i - 1;
            }
        }?>

我尝试使用while循环而不是if / else语句,但这并没有解决缓慢加载问题。

代码的其他相关部分:

// Gets all IDs in database
function getIDs() {
    $handler = dbconnector();

    $query = $handler->query('SELECT id FROM dishes');
    $query->setFetchMode(PDO::FETCH_ASSOC);
    $output = $query->fetchAll();
    $array = array();
    for ($i = 0; $i < count($output); $i++) {
        array_push($array, $output[$i]['id']);
    }
    return $array;
}

// Chooses a random ID that exists
function getinfoForRandom() {
    $IDs = getIDs();
    $totalIDs = count($IDs);

    do {
        $random = mt_rand(1, max($IDs));
    } while (!in_array($random, $IDs));

    return $random;
}

// Pulls data for the randomly selected ID
function pullrandinfo($id) {
    $handler = dbconnector();

    $query = $handler->query('SELECT id, name, filename FROM dishes WHERE id = ' . $id);

    $query->setFetchMode(PDO::FETCH_ASSOC); // Fetches only assoc array from the query above

    $data = $query->fetchAll();
    return $data;
}

1 个答案:

答案 0 :(得分:1)

您可以通过限制执行的查询数来提高性能。

您的代码似乎在每个循环中执行两个查询,一个在getIds()中,另一个在pullrandinfo()中。这些查询既昂贵又耗时。

相反,使用SQL RAND()在单个查询中获取您的ID。

SELECT id FROM <table> ORDER BY RAND() LIMIT 4;

然后在一个查询中获取所有ID:

'SELECT ... WHERE id IN (' . implode(',', $ids) . ')...'

最后,仅使用循环输出数据。