Вопрос производительности класса php... что мне делать?
Я создаю веб-приложение, используя 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 ответа
Включение определенного PHP-файла в функцию / метод, а не открытое включение определенно поможет, поскольку только необходимые элементы будут включены и интерпретированы. Но интерпретатору PHP все равно нужно будет пройти через этот 5000-строчный код этого огромного класса, что, по моему мнению, действительно плохой способ сделать это и станет серьезным узким местом.
На самом деле, 5000-10000 пользователей - это не так уж много, но это опять-таки зависит от того, каким будет использование. Если все они могут быть зарегистрированы одновременно и выполнять запросы на вашем сервере (что-то вроде 10 тыс. Запросов в минуту или приблизительно 166 запросов / с) и кеширование практически отсутствует, то это может быть серьезным узким местом, но это снова зависит от множества факторов. Вместо этого хорошим способом было бы использовать какой-либо инструмент нагрузочного тестирования, такой как ab или JMeter, и найти его по-настоящему.
Если результаты не выглядят такими хорошими после выполнения этих тестов, выясните, что является узким местом. Вы можете использовать APC или Memcache для реализации кеширования или других способов повысить производительность. Но, сделав дикий снимок в темноте, я бы сказал, что класс 5k line - это то, что вы должны учитывать при разделении не только по соображениям производительности, но и для хорошего дизайна. И, возможно, если логика построения этих фрагментов HTML не слишком сложна, вы могли бы переложить это на клиента, отправив данные в виде JSON/XML и позволив Javascript создать таблицу с использованием этих данных.
У вас действительно более 100 функций в вашем классе?
Возможно (нет, я уверен на 110%), что ваш класс не очень хорошо спроектирован, особенно если он "только" для создания таблиц HTML.
Объектно-ориентированное программирование - хорошая техника, но вы должны правильно ее использовать. Мне кажется, что вы просто собрали все процедурные функции в одном месте. Это не ООП. И это трудно поддерживать код.
100 методов в одном классе - это слишком много. Рефакторинг вашего кода, поместите его в несколько классов и импортируйте только те, которые вам действительно нужны. И даже не зная больше о вашем заявлении, я могу сказать, что оно (и вы) извлечет из этого пользу.
Я не могу позволить вам использовать такой класс с чистой совестью;)
Вы спрашиваете, что вы должны делать?
Изучите ООП в контексте PHP и, возможно, прочитайте что-нибудь о шаблонах проектирования.
Редактировать:
Я только что увидел, что у вас есть функция для создания каждого HTML в вашем приложении, это правильно? Если это так, вам действительно следует подумать о динамическом построении таблиц, что приведет к меньшему количеству кода и, вероятно, будет проще в обслуживании.
Задача решена. Я изменил код, чтобы читать только в той функции, которая была необходима во время вызова. Теперь он читает несколько сотен строк вместо 5000.