加速PHP渲染巨大的选择列表

时间:2014-04-18 01:55:57

标签: php mysql

你们真棒。

我的脚本从MYSQL中选择所有8500个客户,这在MySQL工作台中大约需要 0.16秒,这很好,但它需要浏览器 10秒才能从结果中渲染框。

是否有更快的方法来创建这个巨大的选择框?

我很难过,因为我认为所有的PHP都是在服务器端制作的,无法加速。

<body>
<select name="customer" id="customer" onChange="getcustinfo();" data-placeholder="Choose a Customer" class="chosen-select" style="width:500px;" tabindex="1">
<option value=""></option>
<?php // get the products
    $sql = "
        SELECT *
        FROM `cust`
        LEFT Join `address` 
        ON `cust`.`custid` = `address`.`addcustid`
        and `address`.`addtype` = 'b'
        WHERE `cust`.`custactive` = 'y'"
    ;
    $result = mysqli_query($con,$sql) or die('Query failed: Could not get list of CLIENTS: ' . mysqli_error($con)); // query
        while ($row = mysqli_fetch_array($result)) {
                foreach ($row as $key => $value){ ${$key} = $value; }
                $space="";
                $endingspaces = 4-(2*strlen($prodid));

                $custname = substr($row['custname'],0,15);
                $address1 = substr($row['address1'],0,15);
                $addcity = substr($row['addcity'],0,15);

                print "<option value=\"$custid\">$custid: $space$custname, $address1, $addcity, $addstate</option>";                                                
        }
?>
</select>
</body>

2 个答案:

答案 0 :(得分:3)

缓存。生成HTML 一次,然后将其保存在内存中(如果可以)(APC,内存缓存)或平面文件。然后在后续页面加载时,只需从缓存中读取它并将其回显。 很多更快。

答案 1 :(得分:1)

发现问题。哇。

问题是&#34;打印每个选项行&#34;功能。我在迭代MySQL列表的同时打印了8500个选项中的每一个。每行都是&#34;印刷&#34;并保存在内存中,然后显示在最后。

打印选项功能显然实际上是在每次迭代时将该行发送到浏览器,因此服务器不会编译选择框,而是将其逐段发送到浏览器,花费大量时间。

我修复了,让php在服务器上创建整个选择框(包括在加载项中打开和关闭SELECT标签&#34; select_box&#34;变量),然后发送当它完全完成时,它作为一个回显到浏览器。现在只用了1.2秒。

我可以忍受。

<?php // get the products
    $select_box = "<select name=\"customer\" id=\"customer\" onChange=\"getcustinfo();\" data-placeholder=\"Choose a Customer\" class=\"chosen-select\" style=\"width:227px;\" tabindex=\"1\">
    <option value=\"\"></option>";

    $sql = "
        SELECT *
        FROM `cust`
        LEFT Join `address` 
        ON `cust`.`custid` = `address`.`addcustid`
        and `address`.`addtype` = 'b'
        WHERE `cust`.`custactive` = 'y'"
    ;
    $result = mysqli_query($con,$sql) or die('Query failed: Could not get list of CLIENTS: ' . mysqli_error($con)); // query
        while ($row = mysqli_fetch_array($result)) {
                foreach ($row as $key => $value){ ${$key} = $value; }
                $space="";   
                $custname = substr($row['custname'],0,15);
                $address1 = substr($row['address1'],0,15);
                $addcity = substr($row['addcity'],0,15);

                $select_box .= "<option value=\"$custid\">$custid: $space$custname, $address1, $addcity, $addstate</option>";                                               
        }
    $select_box .="</select>";
    echo $select_box;   
?>