我首先要说的是,我不知道关于PHP的漏洞很多,所以我购买了一个用户管理脚本来帮助管理我的网站。
我将所有用户导入到5400+帐户的脚本中,在脚本的用户管理部分中,当我单击以查看用户脚本将超时时出现致命错误:用户超过30秒的最大执行时间。第45行的PHP。我尝试添加ini_set(“max_execution_time”,“0”);到脚本的开头,然后它将旋转3-5分钟,Apache将超时。这是在我的网络服务器和本地主机上。
以下是第42至48行
function get_user_meta($account_id, $term) {
global $db;
$query = "SELECT * from user_meta WHERE account_id='".$account_id."'";
$result = $db->query($query) or die($db->error);
$row = $result->fetch_array();
return $row[$term];
}//get user email ends here
列出用户的代码部分是。
function list_users($user_type) {
global $db;
global $language;
if($user_type == 'admin') {
$query = 'SELECT * from users ORDER by account_id ASC';
$result = $db->query($query) or die($db->error);
$content = '';
$count = 0;
while($row = $result->fetch_array()) {
extract($row);
$count++;
if($count%2 == 0) {
$class = 'even';
} else {
$class = 'odd';
}
$content .= '<tr class="'.$class.'">';
$content .= '<td>';
$content .= $first_name.' '.$last_name;
$content .= '</td><td>';
if($city != '') {
$content .= $city.', ';
}
if($state != '') {
$content .= $state.', ';
}
$content .= $country;
$content .= '</td><td>';
$content .= $username;
$content .= '</td><td>';
$content .= $email;
$content .= '</td><td>';
$content .= ucfirst($status);
$content .= '</td><td>';
$content .= ucfirst($user_type);
$content .= '</td><td>';
$content .= $this->get_user_meta($account_id, 'last_login_time');
$content .= '</td><td>';
$content .= $this->get_user_meta($account_id, 'last_login_ip');
$content .= '</td><td>';
$content .= '<button class="btn btn-default btn-sm pull-left" style="margin-right:5px;" data-toggle="modal" data-target="#modal_'.$account_id.'">'.$language["message"].'</button>';
$content .= '<!-- Modal -->
<script type="text/javascript">
$(function(){
$("#message_form_'.$account_id.'").on("submit", function(e){
e.preventDefault();
tinyMCE.triggerSave();
$.post("includes/messageprocess.php",
$("#message_form_'.$account_id.'").serialize(),
function(data, status, xhr){
$("#success_message_'.$account_id.'").html("<div class=\'alert alert-success\'>"+data+"</div>");
});
});
});
</script>
<div class="modal fade" id="modal_'.$account_id.'" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<form id="message_form_'.$account_id.'" method="post" name="send_message">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">'.$language["send_message"].'</h4>
</div>
<div class="modal-body">
<div id="success_message_'.$account_id.'"></div>
<div class="form-group">
<label class="control-label">'.$language["message_to"].'</label>
<input type="text" class="form-control" name="message_to" value="Email:('.$email.') Username: ('.$username.')" readonly="readonly" />
</div>
<div class="form-group">
<label class="control-label">'.$language["subject"].'</label>
<input type="text" class="form-control" name="subject" value="" />
</div>
<div class="form-group">
<label class="control-label">'.$language["message"].'</label>
<textarea class="tinyst form-control" name="message"></textarea>
</div>
</div>
<input type="hidden" name="from" value="'.$_SESSION['account_id'].'" />
<input type="hidden" name="account_id" value="'.$account_id.'" />
<input type="hidden" name="single_form" value="1" />
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">'.$language["close"].'</button>
<input type="submit" value="Send Message" class="btn btn-primary" />
</div>
</div><!-- /.modal-content -->
</form>
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->';
$content .= '<form method="post" name="edit" action="manage_users.php">';
$content .= '<input type="hidden" name="edit_user" value="'.$account_id.'">';
$content .= '<input type="submit" style="margin-right:5px;" class="btn btn-default btn-sm pull-left" value="'.$language["edit"].'">';
$content .= '</form>';
$content .= '<form method="post" name="delete" onsubmit="return confirm_delete();" action="">';
$content .= '<input type="hidden" name="delete_user" value="'.$account_id.'">';
$content .= '<input type="submit" class="btn btn-default btn-sm pull-left" value="'.$language["delete"].'">';
$content .= '</form>';
$content .= '</td>';
$content .= '</tr>';
unset($class);
}//loop ends here.
} else {
$content = $language["cannot_i_user"];
}
echo $content;
}//list_levels ends here.
我联系了创作者并被告知。现在子系统使用Jquery数据表来排列数据应用过滤器,并应用页面,所以当使用jquery的数据表时,我们必须在你的情况下一次从表中获取所有行,你有这么多记录,这就是你遇到问题的原因。他想要我20美元来修理它。
答案 0 :(得分:-1)
是的,尝试以较小的方式将结果用于某种方式。编写一个函数,使单个记录保持十个或更好,一次一个,从一开始,从那里开始。看看它如何扩展。这样,您的用户可以确保在检索和处理所有其余记录时看到某些内容。
另外,如果你不了解php,那么购买现成的脚本是一件非常糟糕的事情。从下到上构建。
保持你的20美元一些体面的咖啡/啤酒,而你在PHP上寻找一些基本的tutes。或者通过本书获得精彩而温和的语言介绍 - 数据库,分页结果集,登录,您可以命名:http://www.amazon.com/PHP-Solutions-Dynamic-Design-Made/dp/1430232498
就你的剧本而言,
$query = 'SELECT * from users ORDER by account_id ASC LIMIT 10';
是一个好的开始,然后从那里开始。
或者你可以将整个查询+处理放在for循环中,每次迭代循环执行十次强检索。
此外,由于我们是关于性能的主题,这是一个关于变量插值与连接的好方法(即处理如何构建字符串/ html)。 http://nikic.github.io/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html
请记住,在这个例子中,当您掌握语言时,代码可读性是最重要的,因此我将使用插值变量。通过这种方式,您可以看到正在发生的事情,同时您无法从数据库中获取所有这些结果并将其用于您的页面。不要被吓倒,一旦你采取暴跌,PHP是一个很好的直接语言。
另一种方法是在用户首次加载页面/点击以获得结果时提供小的结果集,然后通过AJAX逐步提供其余部分,即无需重新加载页面,只需将后续元素插入你的师在他们准备好的时候。这是一个很好的AJAX教程,可以帮助您入门: