вопрос производительности класса php ... что мне делать? - PullRequest
1 голос
/ 16 января 2010

Я создаю веб-приложение, используя php, ajax, javascript, mysql. Некоторое время я беспокоился о чем-то, но не уверен, действительно ли это проблема или нет. Вот основная концепция того, как работает код ... Я хотел бы знать, должен ли я изменить его сейчас, или это нормально для использования как есть. Для меня важна производительность ... более 5000 пользователей должны иметь возможность использовать приложение без особых проблем с производительностью. Часть моего беспокойства - просто паранойя того, чтобы быть разработчиком-самоучкой и не знать всех лучших практик там.

Вот основные функции веб-приложения:

пользователь выполняет вызов через браузер через событие onclick -> ajax вызов phpPG1.php. -> phpPG1.php запускает запрос к базе данных и сохраняет результаты в массиве, затем включает в себя другую страницу php с именем HTMLphp.php, создает новый объект со страницы HTMLphp.php, который является функцией класса -> calles класса и передает массив, содержащий результаты запроса -> функции класса строят таблицу HTML и возвращают строку -> страница phpPG1.php отправляет обратно строку с данными таблицы в вызов ajax, который отображает строку в данном теге DIV он принадлежит.

HTMLphp.php содержит все функции, которые используются для возврата таблиц HTML для всего веб-приложения. HTMLphp.php будет выглядеть примерно так:

Class HTML_stuff
{
   function html_TABLE1($results_array)
   {

      $string = 'THE HTML TABLE WITH ITS DATA IN IT'
      return $string
   }

   function html_TABLE2($results_array)
   {

      $string = 'THE HTML TABLE WITH ITS DATA IN IT'
      return $string
   }

}

Итак, вот мой вопрос. страница HTMLphp.php содержит 5606 строк кода, которые представляют около 100 функций в классе. По сути, каждая страница в моем веб-приложении «включает» эту страницу, чтобы иметь возможность использовать функции класса для отображения html-таблиц. Я почти закончил работу с веб-приложением, так что в этом файле будет добавлено гораздо больше строк кода. Я не совсем в курсе того, как компьютеры выполняют код, особенно при использовании объектов классов, но я понимаю основы, если "интерпретирующие языки", такие как php.

Мне интересно, является ли это плохой идеей и нужно ли мне делать что-то вроде этого: Для каждой функции внутри класса HTML_stuff просто удалите код для каждой функции и поместите его на свою отдельную страницу .php, которая будет включена как это:

Class HTML_stuff
{
   function html_TABLE1($results_array)
   {
      include_once 'TABLE1.php'; //the html table for this function.
      return $string;
   }

   function html_TABLE2($results_array)
   {
      include_once 'TABLE2.php';
      return $string;
   }
}

Мое основное предположение заключается в том, что я включаю только HTML-код, необходимый для выполнения вызова конкретной функции, что позволяет уменьшить общий размер страницы HTMLphp.php, если предположить, что это поможет повысить общую производительность сайта ... Я слева поле с этим мышлением? Часть меня думает, что это просто то же самое, что и первый вариант, просто организовано по-другому, и это повлияет на общую производительность. Однако я где-то читал, что меньше «включений» лучше для производительности.

Что делают другие люди, или есть другие лучшие практики, как делать такие вещи? Можно ли беспокоиться об этом на сайте, скажем, от 5000 до 10000 пользователей?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 января 2010

Включение определенного PHP-файла в функцию / метод, а не открытое включение определенно поможет, поскольку только необходимые элементы будут включены и интерпретированы. Но интерпретатору PHP все равно нужно будет пройти через этот 5000-строчный код этого огромного класса, что, по моему мнению, действительно плохой способ сделать это и станет серьезным узким местом.

На самом деле 5000-10000 пользователей - это не так уж много, но это опять-таки зависит от того, как будет их использование. Если все они могут быть зарегистрированы одновременно и выполнять запросы на вашем сервере (что-то вроде 10 тыс. Запросов в минуту или приблизительно 166 запросов / с) и кеширование практически отсутствует, то это может быть серьезным узким местом, но это опять же зависит от множества факторов. Вместо этого хорошим способом для этого было бы использовать какой-либо инструмент нагрузочного тестирования, такой как ab или JMeter , и найти его по-настоящему.

Если результаты не выглядят такими хорошими после выполнения этих тестов, выясните, что является узким местом. Вы можете использовать APC или Memcache для реализации кеширования или других способов повысить производительность. Но, сделав дикий снимок в темноте, я бы сказал, что класс 5k line - это то, что вы должны учитывать при разделении не только по соображениям производительности, но и для хорошего дизайна. И, возможно, если логика построения этих фрагментов HTML не слишком сложна, вы могли бы переложить это на клиента, отправив данные в виде JSON / XML и позволив Javascript создать таблицу с использованием этих данных.

2 голосов
/ 16 января 2010

У вас действительно есть более 100 функций в вашем классе?
Вероятно, (нет, я уверен на 110%), тогда ваш класс плохо спроектирован, особенно если он "только" для создания таблиц HTML.

Объектно-ориентированное программирование - хорошая техника, но вы должны использовать ее правильно. Мне кажется, что вы просто собрали все процедурные функции в одном месте. Это не ООП. И это трудно поддерживать код.

100 методов в одном классе - это слишком много. Рефакторинг вашего кода, поместите его в несколько классов и импортируйте только те, которые вам действительно нужны. И даже не зная больше о вашем заявлении, я могу сказать, что оно (и вы) извлечет из этого пользу.

Я не могу позволить вам использовать такой класс с чистой совестью;)

Вы спрашиваете, что вы должны делать?
Изучите ООП в контексте PHP и, возможно, прочитайте что-нибудь о Шаблонах проектирования .

Edit:

Я только что увидел, что у вас есть функция для создания каждого HTML в вашем приложении, это правильно? Если это так, вам действительно следует подумать о динамическом построении таблиц, что приведет к меньшему количеству кода и, вероятно, будет проще в обслуживании.

0 голосов
/ 16 января 2010

Проблема решена. Я изменил код, чтобы читать только те функции, которые были необходимы во время вызова. Теперь он читается в нескольких сотнях строк вместо 5000.

...