这个特定的PHP函数需要15秒来计算。它的哪一部分导致了滞后?
我知道这看起来很具体,但我对PDO数据库连接还不熟悉,所以我不得不重写这个组件。我使用Php微时间检查代码的哪一部分加载缓慢,并将其缩小到下面的函数(从类文件调用)。你能帮我找出这段代码中效率低下的部分是什么吗?我的其他函数也使用PDO,有些函数还查看联接表,没有任何性能问题这个特定的PHP函数需要15秒来计算。它的哪一部分导致了滞后?,php,mysql,performance,pdo,Php,Mysql,Performance,Pdo,我知道这看起来很具体,但我对PDO数据库连接还不熟悉,所以我不得不重写这个组件。我使用Php微时间检查代码的哪一部分加载缓慢,并将其缩小到下面的函数(从类文件调用)。你能帮我找出这段代码中效率低下的部分是什么吗?我的其他函数也使用PDO,有些函数还查看联接表,没有任何性能问题 public function GetRecentActivity($user = null, $length = 20){ global $pdo; if($user==null){
public function GetRecentActivity($user = null, $length = 20){
global $pdo;
if($user==null){
$user = ((isset($_SESSION['UserID']))?$_SESSION['UserID']:FALSE);
}
if($user==FALSE){
return -1;
}
$actions = array();
$courses = $pdo->prepare("SELECT courses.courseID, courses.courseName FROM courses INNER JOIN courseRoles on courses.courseID = courseRoles.courseID WHERE courseRoles.userRole != 'Blocked' AND courseRoles.userID = :user");
if(!$courses->execute(array(':user'=>$user)))
return -1;
// now we have an array of [courseID, courseName]
//prepare some statements for the big loop
$discs = $pdo->prepare("SELECT dID, dTitle, courseDiscussions.courseDiscussionTime FROM discussions INNER JOIN courseDiscussions on discussions.dID = courseDiscussions.discussionID WHERE courseDiscussions.courseID = :cID");
$last = $pdo->prepare("SELECT logTime from logs WHERE logAction = 'view' AND logUserID = :user AND logPageID = :dID ORDER BY logTime DESC LIMIT 1");
$posts = $pdo->prepare("SELECT postAuthorID, postMessage, postTime, users.firstName, postID, postType FROM posts INNER JOIN users ON posts.postAuthorID = users.userID WHERE postID IN (SELECT logActionID FROM logs INNER JOIN discussionPosts ON discussionPosts.postID = logs.logActionID WHERE logs.logAction = 'addPost' AND logs.logTime > :lastView AND logs.logPageID = :dID)");
while($row = $courses->fetch()){
$cID = $row['courseID'];
if(!$discs->execute(array(':cID'=>$cID)))
return -1;
while($d_row = $discs->fetch()){
$dID = $d_row['dID'];
//find out when the user last visited this disucssion
$last->execute(array(':user'=>$user,':dID'=>$dID));
$lastView = $last->fetch();
$lastView = $lastView['logTime'];
if(empty($lastView)){
$lastView = $d_row['courseDiscussionTime'];
}
$posts->execute(array(':lastView'=>$lastView,':dID'=>$dID));
while($p_row = $posts->fetch()){
$path = "/discussion.php?c=".$cID."&d=".$dID."&p=".$p_row['postID'];
array_push($actions, array("action" => 'post',"actionTime" =>$p_row['postTime'], "actionType" =>$p_row['postType'], "context" =>'discussion', "contextLabel" =>$d_row['dTitle'] ,"contextID" =>$dID, "agentLabel" => $p_row['firstName'], "agentID" =>$p_row['postAuthorID'], "content" =>substr($p_row['postMessage'],0,120), "actionPath" =>$path));
}
}
}
usort($actions, function($a,$b){
return strtotime($b['actionTime']) - strtotime($a['actionTime']);
});
$actions = array_slice($actions,0,$length);
return $actions;
}
您有多个嵌套的查询/获取循环,可以通过单个联接查询来完成。其中一个查询可能是性能低下的原因,特别是因为它们是在循环中执行的。正如Michael所说,您的
$courses
结果产生了倍增效应。与其单独运行所有这些查询,不如将它们组合起来,在循环之前尽可能地限制结果。我明白了,现在已经循环了好几次了。我将致力于改进查询。谢谢