【问题标题】:PHP Script wont load table with large amount of dataPHP 脚本不会加载包含大量数据的表
【发布时间】:2014-07-25 20:33:34
【问题描述】:

首先我想说我对 PHP 了解不多,所以我购买了一个用户管理脚本来帮助管理我的网站。

我将我所有的用户导入到脚本中,即 5400 多个帐户,在脚本的用户管理部分,当我单击查看用户时,脚本将超时并出现致命错误:用户超过 30 秒的最大执行时间。 php 在第 45 行。我尝试添加 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">&times;</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 美元来修理它。

【问题讨论】:

  • “他想给我 20 美元来修理它。”对我来说听起来很划算。
  • 我宁愿买一个新的用户管理系统,然后再给他 20 美元来修复我已经购买的脚本的缺陷。
  • 是的...如果你用 jQuery 操作 5400 条记录,你会很糟糕的。
  • 所以,相反,您希望我们为您修复它...免费?
  • 不想看看是否有人有任何想法,关于如何尝试修复它。

标签: php mysqli


【解决方案1】:

是的,尝试以一种或另一种方式在较小的集合中获取结果。编写一个函数来获取十个或更好的单个记录,一次一个,从那里开始,然后从那里获取它。看看它是如何扩大的。这样一来,您的用户就可以确保在您检索和处理所有其余记录时看到某些内容。

此外,如果您不了解 php,购买现成的脚本是一种非常糟糕的方式。自下而上构建。

保留 20 美元买一些像样的咖啡/啤酒,同时寻找一些关于 php 的基本教程。或者获取这本书,以获得对语言的精彩而温和的介绍 - 数据库、分页结果集、登录,你可以命名它: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 教程,可以帮助您入门:

http://www.w3schools.com/php/php_ajax_database.asp

【讨论】:

  • 咖啡 10 美元,啤酒 10 美元,然后整晚改写脚本:)
  • 将看看那个,现在阅读 php jquery 分页。
  • @ESG - 你试过set_time_limit(0); 吗?
  • 是的,我有,它会一直运行到你得到 504。认为我最好的选择是阅读其中的一些内容,分页看起来可以解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2021-10-29
  • 2011-10-02
相关资源
最近更新 更多