Datatables Обработка на стороне сервера очень медленная - PullRequest
0 голосов
/ 15 мая 2018

Я использую Обработка данных на стороне сервера с использованием PHP, Jquery, Ajax и моей базы данных в SQL Server.

Данные правильно отображаются в таблице, но такие функции, как разбиение на страницы и поиск, работают очень медленно.Каждый раз, когда я печатаю в поле поиска или меняю нумерацию страниц на следующую страницу, я жду более 40 секунд, хотя я не имею дело с большими данными.

Вот моя индексная страница

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html" charset=utf-8" />
  <title> Datatables using PHP Ajax Jquery </title>

<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap.min.css">

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>


 </head>
 <body>
  <div class="container">
    <div class="table-responsive">
      <table id="example" class="table table-striped table-bordered" style="width:100%">
        <thead>
            <tr>
                <th>Country</th>
                <th>Customer</th>
                <th>Address</th>
                <th>Contact</th>
                <th>Price</th>
                <th>Qty</th>
            </tr>
        </thead>
      </table>
   </div>
  </div>
 </body>
</html>

<script type="text/javascript" language="javascript" >
$(document).ready(function() {
            $('#example').DataTable({
            "columns": [
                {"data": "Country"},
                {"data": "Customer"},
                {"data": "Address"},
                {"data": "Contact"},
                {"data": "Price"},
                {"data": "Qty"}
            ],
            "processing": true,
            "serverSide": true,
            "ajax": {
                url: 'fetch.php',
                type: 'POST'
            }
        });
} );
</script>

ивот мой fetch.php, где находится вызов Ajax

<?php 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

if (!empty($_POST) ) {

$ser="****";
$db="****";
$user="****"; 
$pass="****";
$MyTable="****";

$dbDB = new PDO("odbc:Driver=ODBC Driver 13 for SQL Server;Server=****;Database=****", $user, $pass);


    function getData($sql){
        global $dbDB ;
        global $MyTable ;
        $result = $dbDB->query($sql);
        $rows = $result->fetchAll(PDO::FETCH_ASSOC);
        $data = array();
        foreach ($rows as $row) {
        $data[] = $row ; }
        return $data; }

    $draw = $_POST["draw"];
    $orderByColumnIndex  = $_POST['order'][0]['column'];
    $orderBy = $_POST['columns'][$orderByColumnIndex]['data'];
    $orderType = $_POST['order'][0]['dir']; 
    $start  = $_POST["start"];
    $length = $_POST['length'];

    $recordsTotal = count(getData("SELECT * FROM ".$MyTable));

    if(!empty($_POST['search']['value'])){

        for($i=0 ; $i<count($_POST['columns']);$i++){
            $column = $_POST['columns'][$i]['data'];
            $where[]="$column like '%".$_POST['search']['value']."%'";
        }
        $where = "WHERE ".implode(" OR " , $where);

        $sql = sprintf("SELECT * FROM %s %s", $MyTable , $where);
        $recordsFiltered = count(getData($sql));

         $sql = sprintf("SELECT Country,Customer,Address,Contact,Price,Qty FROM %s %s ORDER BY %s %s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", $MyTable , $where ,$orderBy, $orderType ,$start,$length);
         $data = getData($sql);
    }

    else {
        $sql = sprintf("SELECT Country,Customer,Address,Contact,Price,Qty FROM %s ORDER BY %s %s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", $MyTable ,$orderBy, $orderType ,$start,$length);
        $data = getData($sql);
        $recordsFiltered = $recordsTotal;
    }

        $response = array(
        "draw" => intval($draw),
        "recordsTotal" => $recordsTotal,
        "recordsFiltered" => $recordsFiltered,
        "data" => $data
    );

    echo json_encode($response);

} 

else {
    echo "NO POST Query from DataTable";
}

?>

Я не понимаю, почему поиск и разбиение на страницы очень медленные, когда я использую обработку на стороне сервера.Я проверил некоторые параметры в документации datatables, но это не ускорило время загрузки.

есть идеи, пожалуйста, где может быть проблема?Большое спасибо.

1 Ответ

0 голосов
/ 15 мая 2018

Это просто предположение (т. Е. Может быть какая-то странная библиотека javascript, которая обнуляет ваше время загрузки), но это, вероятно, связано со следующими строками:

$recordsTotal = count(getData("SELECT * FROM ".$MyTable));

$recordsFiltered = count(getData($sql));

Вы выбираете все из базы данных изатем продолжайте считать эти строки с помощью PHP.База данных может сделать это бесконечно быстрее с помощью функции COUNT .

Кроме того, оптимальный путь для вашего кода включает 2 запроса к базе данных.Другой требует 3 запроса, из которых 2 невероятно тяжелы по производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...