Про xPDO
Ця нотатка назрівала вже дуже давно, півроку мінімум. Навколо чудового MODX Revolution зламано багато копій. Ходять чутки, що він «гальмівний», «ненажерливий» та «неповоротливий». І головним винуватцем завжди називають xPDO.
Звичайно, це нісенітниця і мета нотатки – розвінчання міфів. Закрити, нарешті, питання з «гальмами» та «ненажерливістю». Показати, наскільки Revolution зручний і гнучкий, що він дозволяє працювати як через ORMxPDO, так і без нього через звичайний PDO. Ви можете працювати з MODX різними шляхами, вам не нав'язують xPDO. Не подобається - не користуйтеся, пишіть SQL запити вручну.
Зі вступом покінчено, йдемо далі.
Підготовка
Для того, щоб розібратися з питанням, нам знадобиться файл тестування. Створюємо, наприклад,test.phpв корені сайту і пишемо туди ось це: Так, ми будемо працювати вMODX_API_MODE, щоб уникнути навантажених шаблонів та іншого можливого лушпиння на робочому сайті . Адже нас цікавить робота фреймворку, так?
Запускаємо файл, і бачимо: Все зрозуміло? Запуск та підготовка до роботи всього MODX Revolution займає 2,5 мегабайта пам'яті та 2 десятитисячні секунди. Решта — це час, який витрачає програміст.
Дані цифри реальні лише за включеномуphp-apc. Якщо відключити - споживання пам'яті і часу буде в 2 рази вище:Всі подальші цифри і тести я наводитиму з php-apc. Це фактично стандарт для хостингів, він увімкнений за умовчанням на MODX Cloud і, можливо, увійде в ядро PHP 6.
Всі команди ми додаємо в цей тестовий файл і в місці, що цікавить, викликаємоgetStatus('текстова мітка');.
3 способи роботи з БД
Як прийнято звертатися до MySQL на PHP? Дуже просто: Ось так ми отримали масив із записами з таблиці. Недуже зручно, так? Зате офігенно швидко:0,0023038387298584 сек. та 3 873,64 Кб. (1019,61 Кб.). У дужках пам'ять, з'їдена саме цією операцією. Без дужок — загальна, левову частку якої відіжджав MODX.
Зрозуміло, що це застаріла методика. Зрозуміло, що тільки самогубець зараз писатиме такі запити, бо ви обов'язково пропустите пару-трійку ін'єкцій і ваш сайт поламають. Та й тоскно це. Тому розумні люди вигадали PDO.
Як через нього можна працювати в MODX? Ще простіше: Результати:0,0021560192108154 сек. та 3 989,02 Кб. (1134,99 Кб.). Різниця в районі похибки, ми також пишемо прямі запити в БД, обмежені тільки нашою фантазією. Проте вже видно принади PDO: простіший і зручний код і підготовлені вирази, які захистять нас від ін'єкцій.
Потрібно знати, що той запит написаний для mySQL та з MsSQL, наприклад, може і не працювати через різницю цих БД. Зрозуміло, що мова там одна — SQL, але є різні нюанси. А MODX підтримує MsSQL.
Як же написати наш супер-пупер компонент із різними крутими запитами, щоб працювало відразу на всіх БД, які вміє MODX? А тут нам на допомогу приходить xPDO. Результати:0.00597095489502 сек. та 10 845,90 Кб. (2398,56 Кб.). Ресурсів пішло більше в 2 рази, але наш запит тепер і підтримує 2 бази даних (Mysql і MsSQL), а якщо чарівники MODX додадуть підтримку інших БД, то newQuery побудує і підготує запит і для них.
Потрібно розуміти, що різниця в часі обумовлена генерацією запиту MySQL методом$modx->newQuery(), що не впливає на швидкість вибірки. Це означає, що якщо вибирати багато даних, то різниця невелика.
| 500 ресурсів | 0.011471033096313 сек. 7 083,84 Кб. (3 994,36Кб.) | 0.017184972763062 сек. 7 849,96 Кб. (4 759,93 Кб.) |
| 1000 ресурсів | 0.037826061248779 сек. 11 446,41 Кб. (8357,57 Кб.) | 0.046993970870972 сек. 12 465,15 Кб. (9375,13 Кб.) |
Тобто наш запит став набагато більш універсальним та абстрактним. Це, звичайно, їсть більше ресурсів, але вас ніхто не змушує робити саме так. Є PDO, його ніхто не сховав – пишіть усі запити на ньому і у вас буде мега-швидкість.
Наголошую на червоному —MODX не змушує вас використовувати свій xPDO, це тільки особисто ваш вибір. Ви можете писати скрипти для будь-яких ситуацій через чистий PDO і радіти швидкості. Однак, ваші запити не будуть універсальними, але це треба далеко не всім.
Навіщо ще потрібний xPDO?
Першу причину ми вже з'ясували — це універсальність. Ви пишіть свій код і не морочитеся, з якими БД він працюватиме.
Інші причини - цезручність, безпекаіцілісність даних.
Звичайно, за зручність потрібно платити, і в даному випадку ми платимо за продуктивність. А за автоматичну коробку передач на автомобілях ми платимо підвищеним споживанням бензину, олії та дорожчими гарантійними техоглядами. Тобто карбованцем.
Особисто я дотримуюся думки, що сервери та комп'ютери пішли настільки вперед, що заощаджувати на ОЗУ чи процесорах просто нерентабельно. Час програміста коштує набагато дорожче.
Скільки ви витрачаєте на хостинг на місяць? Особисто я, близько 1000 рублів - це 2 години моєї роботи на замовлення. Тому кожен вирішує для себе, що краще — писати код довго, нудно і економити на залізі, або ж швидко і зручно — але з додатковими витратами на сервер.
Нагадую, що в MODX Revolution можливі обидва варіанти – вибір за вами. Оптимальний, як завжди, посередині. Наприклад, після розробки сайту оптимізую його вузькі місця, у тому числі, переписуючи роботу з БД на PDO, де потрібно.
Отже, в чому зручність? А зручність у тому, що xPDO надає нам наші дані у виглядіоб'єктів, з різними методами. Отримуючи ресурс через$modx->getObject(), ви не просто дістаєте дані з таблиці — ви отримуєте екземпляр класуmodResource, який має унікальні методи, при цьому успадковуючи додаткові від батька -xPDOSimpleObject, типу set(), get(), save(), remove(), toArray().
Про це треба пам'ятати.
Наприклад: Спробуйте переписати це на PDO, як буде час і порівняйте скільки у вас вийде рядків.
А потім почитайте докладний посібник з роботи з об'єктами та їх зв'язками англійською або українською. Прикинули, як працювати з усім цим багатством ручками, прописуючи постійні SELECT, UPDATE, INSERT та DELETE? Простіше одразу застрелитися.
З xPDO ви піднімаєтеся на зовсім інший рівень роботи. Якщо подивитися в вихідні коди MODX, то можна побачити, скільки там різних перевірок і наворотів при, здавалося б, простих діях. Наприклад, при зміні якогось поля ресурсу надіслані дані приводяться до вигляду, який вимагає модель цього об'єкта. Якщо ви надішлете в поле parent рядок «15», то він перетвориться на ціле 15, зрозуміло?
При видаленні ресурсу буде видаленовсі об'єкти, підпорядковані йому, типу значень параметрів ТБ. Якщо ви видаляєте контекст, будуть видалені всі ресурси та значення ТБ параметрів цього контексту. Вам не потрібно стежити самому.
Ось вам безпека та цілісність даних. Якщо ви правильно написали модель свого розширення, розписали всі зв'язки – xPDO сам подбає про актуальність даних. Зрозуміло, що в об'єктах MODX все написано як слід.
Це і єORM, якщо стисло. Методи getObject(), getCollection() та інші потрібно застосовувати не від балди, а суворо усвідомлюючи, що зараз вам потрібні саме об'єкти, а не дані з таблиці БД. Наприклад, ви знаєте, що замість getCollection() можна застосовуватиgetIterator(), який дістає не відразу всі відповідні об'єкти, за раз, а по черзі — у циклі? Економія пам'яті, між іншим.
Якщо вам потрібно вивести 100 товарів на сторінці, очевидно, що краще використовувати PDO - буде швидше і ви не робите жодних маніпуляцій, тільки показуєте вміст таблиці БД. А от якщо потрібно вибрати 10 ресурсів і змінити у них батька - тут зручніше xPDO.
Тобто потрібно розуміти, що саме ви робите.
Висновок
MODX Revolution, як і xPDO - це величезна валіза з інструментами на всі випадки життя. Це фреймворк, котрий за старою звичкою косить під CMS. І кінцевий результат залежить лише від умінь та знань програміста.
Хочете мега швидкості – використовуйте PDO, або навіть інший фреймворк. Хоча чистий PHP буде набагато швидше. Але навіть він не зрівняється зі статичним HTML. Натяк ясний?
Хочете зручність — купуйте краще сервер і пишіть із задоволенням, оперуючи об'єктами і вдаючись до PDO в навантажених завданнях, типу одночасної вибірки 1000 ресурсів.
Підходити до ORM з мірками прямих запитів у БДпросто не можна - це різні речі, для різних завдань. Ви не просто працюєте з БД - ви працюєте з об'єктом своєї системи, що має зв'язки з іншими об'єктами.
MODX їсть від 2,5 до 6 мегабайт ОЗУ, і витрачає 2-4 десятитисячні секунди на ініціалізацію. Решта часу і пам'ять — на вашому совісті.
Сподіваюся, після цієї замітки у багатьох проясниться у голові.