Недостатки MVC
Вступление:
MVC - он же M(модель) - V(вид) - C(контроллер), сильно возлюбленный и широко используемый в популярнейших PHP Framework и проектов созданных с нуля.
Вы увидите наоспоримые доказательсова недостатков, основанные на проведении численных и правильных тестирований.
Глобальная проблема сайтов - скорость загрузки, плохое продвижение в поиске, взломы, бесконечные переходы от одного фреймворка к другому. Все попытки полного пересоздания проекта с внедрением нового фреймворка и близко не решают проблему со скоростью работы сайта!
Почему так происходит? Причина проста. Больше скопировал - больше заработал.
Готовы узнать о недостатках, о которых не подозреваете?
План разбора недостатков:
- Много кода
- Очень много действий движка PHP
- Пожерание ОЗУ
- Долгое время выполнения php кода
- Нагрузочное тестирование Apache Jmetr
- Незадействанный код
- Удар по безопасности
Много кода:
Все недостатки ООП, относятся к этой теме, поскольку MVC использует парадигму объектов. За эти годы людям настолько вдолбали в голову, что без ООП ничего нереально и большинство в это поверило. Неважно, какая задача и кто бы ее не решал - все на ООП.
Даже получение значений суперглобальных массивов и свойств не обходится без отдельных пользовательских функций в классе.
Кто знаком с термином "процедурный стиль" знает, что используя function(){} кода получается меньше, при этом многочисленный набор функций остается. Но никто из Вас не догадывается, что можно обойтись вообще без function(){} и кода будет до 70% меньше.
Чтобы понять, почему много кода, предлагаю вспомнить, что такое Класс. Класс - это некое описание объекта, содержащие в себе набор функций. Их количество разное и далеко не все отрабатывают.
Часто одна, или несколько функций. Получается невызванные функции забирают лишние ресурсы памяти и мощности процессора. К этому ещё вернемся!
Очень много действий движка PHP
Получив запрос, приложение PHP тратит много действий на обработку ООП: чтение большого файла и загрузка в ОЗУ -> синтасчический анализ кода -> создание экземпляра класса, запись переменной объекта в ОЗУ -> вызов конструктора (если он есть) -> обращение к переменной объекта -> вызов нужных функций. На много больше действий, по сравнению с структурным стилем программирования.
В попытках написания самого генеального и максимально чистого кода на ООП - лишних действий интерпрератору не избежать! Вызов простой function(){} требует гораздо меньше этапов!
Пожерание ОЗУ
Самый чистый MVC способен на беспощадное пожерание памяти, несмотря на отсутствие соединений с БД, вызов функций бизнес логики. Речь идет о проверке части кода определения нужного контроллера, экшена и вызова. Результаты потребления ОЗУ следующие:
Большое потребление ОЗУ в сравнении с нашими проектами на чистом коде (html, css, javascript, php):
- 8424 байт - ИМ Посади саженец
- 4816 байт - ИМ Соло-лана
- 6832 байт - Большой многостраничник по Ремонту квартир
- 8736 байт - Одностраничный сайт частного сантехника
Это еще не все! Необходимо посчитать, у сколько раз больше потребляет ОЗУ проект MVC за проекты на чистом коде:
- Чистая версия у 7,8 раз больше
- Полная версия у 12,5 раз больше
В примере сравнивается простой проект MVC с более сложными! Почему так, спросите Вы ? Мы не используем MVC в наших проектах!
Долгое время выполнения php кода
Чем больше файл - тем больше в нем кода, а соответственно и количество программных действий! MVC построен на ООП, которое само по себе притормаживает.
Если сравнить язык Си с PHP - по скорости он в разы быстрее, даже с ООП. Здесь никаких секретов нет, поскольку язык компиляционный быстрее за интерпретационный.
Компилятор Си один раз прочитает ООП и создаст исполняемій файл, с машинным кодом, который после запуска работает быстро.
При этом, интерпретатор после каждого вызова тратит много времени на чтения ООП, выполнения шагов вызова объектов и в конце формировку машинного кода, который сработает очень быстро, не сохраняясь в исполняемый файл. Приблизительно 80% времени уходит на чтение текста программы и перевода в машинный код.
Почти никто не принимает во внимание скорость работы оборудования по разным причинам: недостаточная квалификация, быстрые и легкие деньги!
Не мало ученых предупреждали о серьезных проблемах с производительностью подхода ООП. Еще на первых этапах воплощения.
В основной массы создателей сайтов позиция такова:
- кому нужны эти миллисекунды, разница небольшая
- зачем изобретать велосипед
- быстро сделал - получил деньги и взял новый проект
Пока многие сидят на шаблонах, программисты на чистом коде разрабатывают лидирующие решения.
Углубимся в недостатки MVC. Скорость выполнения PHP скриптов невероятно важна в веб-программировании. Оказывает прямое влияние на время ответа сервера, отказоустойчивость при атаках и больших посещениях.
Сравним время работы простого проекта MVC с нашими более сложными по функционалу проектами на чистом коде:
- 0.0029997825622559 сек. - чистая версия MVC (скачать)
- 0.033001899719238 сек. - полная версия MVC (скачать)
Время интерпретации реальных проектов на чистом коде:
- 0.002000093460083 сек. - ИМ Посади саженец
- 0.003000974655151 сек. - ИМ Соло-лана
- 0.003000020980835 сек. - Большой многостраничник по Ремонту квартир
- 0.00099992752075195 сек. - Одностраничный сайт частного сантехника
Если Вы уверены, что миллисекунды роли не играют - Вы сильно ошибаетесь! Предлагаю посчитать, у сколько раз наши проекты работают быстрее:
- У 16.5 раз быстрее - ИМ Посади саженец
- У 10.99 (почти в 11) раз быстрее - ИМ Соло-лана
- У 11 раз быстрее - Большой многостраничник по Ремонту квартир
- У 33 раз быстрее - Одностраничный сайт частного сантехника
Но и это ещё не все! Возможно, Вам такая разница покажется ерундой - Вы опять ошибаетесь! Ступенька за ступенькой приближаемся к розвязке недостатков mvc и следующий этап - нагрузоные тестирования.
Нагрузочное тестирование
Простым языком, цель нагрузочного тестирования заключается в проверке отказоустойчивости проекта, скорости обработки определенного количества пользователей за ед. времени.
Перед запуском тестов, кратко и просто, предлагаю вспомнить принцып работы HTTP-сервера Apache и PHP.
Apache самый популярный и отказоустойчив HTTP-сервер принимает запросы пользователей к серверу на выдачу страниц сайтов. После чего вызывается приложение php, для обработки php кода.
Конечным этапом после успешного выполнения кода приложением php, Apache занимается передачей страницы клиенту.
Время работы PHP кода архиважно, поскольку Apache ставит в очередь других пользователей, а медленная работа кода порождает причину длительных ожиданий при загрузки страниц.
Безусловно, простой проект на mvc проигрывает по всех смыслах. Начинаем запуск нагрузочных тестов. Для этого понадобится Apacje Jmetr с созданным тест планом, доступным для скачивания.
Начнем с 700 пользователей за 1 сек, с повторением 1 раз. Запустив тест простого проекта на mvc смотрим результат:
- Время обработки 700 пользователей: 6 сек.
- Успешно обработанных запросов: 35%
Результат плохой в сравнении с результатами интернет-магазина на чистом коде:
- Время обработки 700 пользователей: 2 сек.
- Успешно обработанных запросов: 80%
Этап тестирований в разгаре, увеличиваем нагрузку в трое:
Проверка проекта mvc:
- Время обработки 700x3 пользователей: 11 сек.
- Успешно обработанных запросов: 46%
Проверка проекта на чистом коде:
- Время обработки 700x3 пользователей: 5 сек.
- Успешно обработанных запросов: 62%
Кто из Вас не принимал во внимание миллисекунды - получите и распишитесь! Время работы php скриптов крайне важно в веб-программировании и нагрузочные тестирования это неоднократно подтверждают.
Безусловно, CMS-системы проигрывают намного больше, поскольку время работы скриптов php в 180-500 раз медленнее за проекты на чистом коде. Они будут протестированы в одном из следующих выпусков.
Незадействанный код
Незадействованный код - один из весомых недостатков mvc. В тестируемом проекте, присутствует функционал регистрации и личных кабинетов. Для показа страницы регистрации и отправки формы используется UserController, состоящий из трех функций:
- actionRegister - Страница "Регистрация"
- actionLogin - Страница "Вход на сайт"
- actionLogout - Удаление данных о пользователе из сессии
После отправки формы регистрации, роутер вызывает функцию "actionRegister", при этом две остальные функции воспринимаются незадействованными, забирая ресурсы ЦП, ОЗУ сервера.
Функция "actionRegister" во время работы обращается к классу User, модели для работы с пользователями, состоящей из 11-ти функций:
- register - Регистрация пользователя
- checkUserData - Проверка существования пользователя с заданными $email и $password
- auth - Запоминание пользователя
- checkLogged - Получение идентификатора пользователя, если он авторизирован.
- isGuest - Проверяет, является ли пользователь гостем
- checkName - Проверка имени: не меньше, чем 2 символа
- checkPhone - Проверка телефона: не меньше, чем 10 символов
- checkPassword - Проверка пароля: не меньше, чем 6 символов
- checkEmail - Проверка email
- checkEmailExists - Проверка на занятость email другим пользователем
- getUserById - Возвращает пользователя с указанным id
Из класса User, вызваны 5 функций, а остальные 6 остались ненужными. Получая запрос от пользователя на выдачу каких-либо других страниц, интерпретатор php аналогично вынужден загружать эти гиганские файлы объектов, вызывая всего лишь одну, или несколько функций.
Это мертвый, незадействованный код в паттернах mvc в стиле ООП! Учёные об этом предупреждали.
Заключение
К сожалению, беспредел на рынке IT-индустрии продолжается и самой главной причиной служит желание заполучить легкие деньги!
Ведь чтобы сделать программный продукт, лучший по техническим характеристикам за 99% готовых решений необходимо упорно набираться коллосального опыта более 5 лет, забыв о легких путях, длительностью 1-3 месяцев, для изучение документации чужих решений mvc.
С причинами, порождающие недостатки mvc и мифами о миллисекундах Вы знакомы. Старайтесь не использовать ООП и MVC в проектах. Пишите каждую программу отдельно и тогда Ваш проект будет работать так быстро, как наши проекты, написанные на чистом коде (html, css, JavaScript, php).