PHP include () разбивает макет страницы, пока включенный файл не завершит запросы к базе данных. - PullRequest
0 голосов
/ 14 декабря 2011

Рассмотрим следующее:

incl.php

<div id='footer'>
  <?php
      sleep(10);
      echo "<div class='footer-float'><!-- content --></div>";
  ?>
  <div style='clear:both;'></div>
</div>

page.php

<div id='main-content'>
  <!-- normal markup structure... -->
</div>
<div id='footer-wrapper'>
  <?php include('incl.php'); ?>
</div>

У меня есть страница (page.php), которая включает нижний колонтитул, разметка для которого находится в incl.php. Настоящий incl.php делает некоторые вещи из базы данных WordPress для поиска последних сообщений и отображения небольшого всплывающего сообщения для каждого из них - это работает нормально, но потому, что существует задержка (представленная здесь командой sleep ()), устанавливающая соединения с базой данных и включающая необходимые файлы WP, это может нарушить макет моей страницы, так как он может приостановить работу на несколько секунд.

Пока он находится в ожидании, плавающие div в моем нижнем колонтитуле означают, что контейнер не будет растягиваться для содержимого, уже загруженного, до тех пор, пока incl.php не завершит выполнение и не предоставит очищающий div, необходимый для растяжения контейнера.

Что я хотел бы знать, так это: есть ли способ заставить PHP обслуживать разметку (то есть нединамический материал) сначала вместо того, чтобы делать все последовательно, как это кажется в данный момент? Иначе, есть ли лучший способ сделать это менее резким? Я не могу установить статическую высоту для рассматриваемого элемента нижнего колонтитула, так как он будет меняться в зависимости от содержимого.

Любые указатели высоко ценится

EDIT: Несколько слов для тех, кто обеспокоен эффективностью:

Эта проблема возникает, когда я тестирую сайт, работающий локально, но сервер базы данных удален и находится на другом конце ненадежного и медленного сетевого соединения (если вы слышали о «ураганном подлости», который может обеспечить немного больше контекста), и это не проблема, которую я ожидаю, чтобы всплыть много, если вообще в живой среде.

Хотя пункты по оптимизации и повышению эффективности приветствуются, я не понимаю, как оправдать тратить время на беспокойство по поводу возможной 2-секундной задержки при загрузке некоторого содержимого нижнего колонтитула, которое возникает только в среде тестирования, - и пожалуйста, не делайте Я ошибаюсь, полагая, что я уже не рассматривал производительность исключительно потому, что сказал, что загрузка загружается с задержкой (опять же - ЛОКАЛЬНЫЙ сайт, УДАЛЕННЫЙ сервер базы данных, МЕДЛЕННОЕ соединение).

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

Ответы [ 4 ]

4 голосов
/ 14 декабря 2011

Если вы хотите сохранить текущий поток без многих изменений, вы можете использовать выходную буферизацию :

// at the begining of your application
ob_start();
// rest of the application: do any kind of output
//...

// at the end, maybe at the end of the footer
ob_end_flush();

В противном случае, если вы не хотите иметь пустую страницу дляЧерез несколько секунд лучшим решением будет использование Ajax: загрузите страницу как обычно (возможно, с минимальной высотой содержимого с помощью загрузчика), а затем загрузите результаты.

2 голосов
/ 14 декабря 2011

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

Редактировать: Вы должны расположить свое включение в лучшем месте.

0 голосов
/ 13 ноября 2014

Эта проблема связана с спецификацией в UTF-8. Вы можете изменить кодировку на ANSI или UTF-8 без спецификации. Некоторые редакторы, такие как RJTextEd, могут записывать файлы в этом режиме. Я проверил Это решает мою проблему с спецификацией.

0 голосов
/ 14 декабря 2011

Я думаю, что это неправильная идея,
Я не думаю, что какой-либо пользователь хотел бы ждать 10 секунд для загрузки компонента.

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

Wordpress уже имеет множество плагинов, написанных специально для кеша: -

...