PHP:对于循环,VPS上的页面加载非常缓慢

PHP:对于循环,VPS上的页面加载非常缓慢,php,mysql,Php,Mysql,我是php新手,所以我很难看出这段代码哪里出了问题。我正在尝试拉一组4个随机ID,以便在页面上显示它们的图像和链接。在我的本地开发环境中运行相同的代码可以很好地工作,并且响应很快。但是,在我的VPS上,加载页面需要15-30秒。我设法将这个问题隔离到这个循环中,只需取出整个块,页面就会再次快速加载 <?php $alreadypicked = array(); for ($i = 1; $i <= 4; $i + 0) { $randchoice = getinfoForRa

我是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;
}
//获取数据库中的所有ID
函数getIDs(){
$handler=dbconnector();
$query=$handler->query('SELECT id FROM displays');
$query->setFetchMode(PDO::FETCH_ASSOC);
$output=$query->fetchAll();
$array=array();
对于($i=0;$iquery('SELECT id,name,filename FROM displays WHERE id='。$id);
$query->setFetchMode(PDO::FETCH_ASSOC);//仅从上面的查询中获取ASSOC数组
$data=$query->fetchAll();
返回$data;
}

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

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

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


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

调用getIDs()需要多长时间?就是这样!不敢相信我没有想到使用SQL的RAND()。。谢谢
SELECT id FROM <table> ORDER BY RAND() LIMIT 4;
'SELECT ... WHERE id IN (' . implode(',', $ids) . ')...'