Создание HTML-таблиц из данных запросов ... быстрее? - PullRequest
4 голосов
/ 07 апреля 2010

Имея ограниченный опыт / знания, я использую следующую структуру для создания таблиц HTML на лету из запросов MySQL:

$c = 0;
$t = count($results);

$table = '<table>';

while ($c < $t) {
   $table .= "<tr><td>$results[0]</td><td>$results[1]</td> (etc etc) </tr>";
   ++$c;
}

$table .= '</table>';

это работает, очевидно. Но для таблиц с 300+ строками есть заметная задержка загрузки страницы, пока скрипт строит таблицу. В настоящее время максимальный список результатов составляет всего около 1100 строк, и ожидание не длинное, но ожидание явно.

Существуют ли другие способы вывода таблицы HTML, которые работают быстрее, чем мой цикл WHILE? (Только PHP ...)

Ответы [ 6 ]

5 голосов
/ 07 апреля 2010

Во-первых, вероятно, медлительность является результатом рендеринга HTML, а не сценария PHP. Во-вторых, создавать очень большие таблицы не очень удобно, лучше использовать подкачку.

Вы можете улучшить производительность скрипта на стороне PHP несколькими способами:

  1. используйте ob_start (); и ob_get_clean (); - таким образом данные будут сразу переданы в html:

    ob_start();
    // your code here
    echo ob_get_clean();
    
  2. использовать массив и объединить для строк:

    $str = array();
    $str[] = 'add the strings';
    echo implode($str);
    

BR.

2 голосов
/ 07 апреля 2010

Существуют ли другие способы вывода таблицы HTML, которые работают быстрее, чем мой цикл WHILE?

Потенциально да. PHP является языком шаблонов. Используйте это как таковое, не боритесь с этим! Собственные шаблоны, скорее всего, будут быстрее, чем кропотливо склеивать строки вручную, и IMO будет более читабельным.

<table>
    <?php foreach($results as $result) { ?>
        <tr>
            <td><?php echo htmlspecialchars($result[0]); ?></td>
            <td><?php echo htmlspecialchars($result[1]); ?></td>
        </tr>
    <?php } ?>
</table>

(Обратите внимание на использование htmlspecialchars. Если вы не используете эту функцию каждый раз, когда вы вставляете простой текст в HTML, ваш код имеет недостатки HTML-инъекции, что приводит к потенциальному Уязвимости в сценариях. Вы можете определить функцию с коротким именем, например h, для выполнения echo htmlspecialchars, чтобы избежать некоторой типизации, но вы должны HTML-кодировать свои строки.

Однако: хотя это красивее и безопаснее, на практике это вряд ли будет значительно быстрее. Ваша медленная рендеринг на стороне клиента почти наверняка будет вызвана еще:

  1. скорости передачи по сети для большого количества табличных данных. Вы можете улучшить это, установив zlib.output_compression, mod_deflate или другой фильтр сжатия для вашего веб-сервера, если вы этого еще не сделали.

  2. скорости рендеринга для больших таблиц. Вы можете улучшить это, установив стиль CSS table-layout: fixed для элемента <table> и добавив элементы <col> с явными стилями width для столбцов, для которых вы хотите иметь фиксированную ширину.

1 голос
/ 07 апреля 2010

Это проблема браузера, а не PHP. Сохраните свою таблицу в HTML и откройте ее - результат будет таким же.

Просто избегайте таких огромных таблиц HTML. Я бы предложил использовать некоторую нумерацию страниц, то есть разделить вашу таблицу на более мелкие страницы, как это делает SO со списком вопросов

1 голос
/ 07 апреля 2010

Первое, что я попробую, - не объединять свои строки. На каждом языке, который я использовал, всегда была небольшая потеря производительности за постоянное добавление строк и выделение одной огромной строки в конце.

Попробуйте вместо этого использовать несколько echo операторов, если можете.

Еще один вариант - исходя из собственного опыта, я уверен, что цикл for ( не for each) быстрее, чем while. Боюсь, у меня нет никаких цифр или доказательств, подтверждающих это, только то, что я наблюдал за эти годы.

0 голосов
/ 07 апреля 2010

загрузить его из XML-файла. Ниже приведена логика.

Вы знаете, когда таблица обновляется. Когда таблица обновляется, запишите все, что должно отображаться в файле XML. Когда пользователь загружает данные загрузки страницы из файла XML. Таким образом, вам не нужно запускать запросы и повторять циклы, когда пользователь загружает страницу. Так быстрее. проверьте и отправьте обратно, если это работает.

Если вы чувствуете, что вышеупомянутая логика все еще медленная, и у вас есть еще больше данных, сделайте следующее - При первой загрузке страницы загружается 100 таблиц данных. Затем запустите ajax-запрос и получите следующие 100 узлов из XML-файла и отобразите его. Как только это закончится, снова запустите ajax-запрос, получите следующие 100 узлов из файла XML и покажите его на странице и т. Д.

0 голосов
/ 07 апреля 2010

Это может быть шагом в правильном направлении.

http://eaccelerator.net/

...