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