Коротка відповідь
- OpenCart 3.0.x, 4.0.x, 4.1.x і PrestaShop 9 працюють на PHP 8.3, який стоїть на моїх серверах.
- PrestaShop 1.7 і 8.x офіційно підтримують PHP максимум 8.1 - на поточному сервері такий магазин не встане, спершу оновлення до 9-ї гілки.
- Одразу після встановлення підніміть
memory_limitдо 256M,upload_max_filesizeдо 64M,max_input_varsдо 10000 іmax_execution_timeдо 300 - заводські значення ламають адмінку тихо, без явних помилок. - Один магазин до 500 товарів - Старт. Магазин плюс тестова копія - вже Оптимал, бо копія на піддомені рахується окремим сайтом. Каталог на тисячі позицій із рекламою - Бізнес і вище.
1. Версія PHP: чи магазин узагалі встане
Для магазину це питання номер один, і його часто пропускають, дивлячись лише на ціну. Кожна гілка OpenCart і PrestaShop має власний діапазон PHP, а установник PrestaShop ще й перевіряє верхню межу: на новішому PHP він просто відмовиться продовжувати.
Діапазони нижче я брав із самого коду установників, а не з маркетингових сторінок:
| Гілка CMS | PHP за установником | На PHP 8.3 у Hosturm |
|---|---|---|
| OpenCart 2.x | до 7.x | не працює, потрібне оновлення |
| OpenCart 3.0.3.x - 3.0.4.x | від 7.3 | працює, перевіряйте старі модулі |
| OpenCart 3.0.5.x | від 8.1 | працює |
| OpenCart 4.0.x | від 8.0 | працює |
| OpenCart 4.1.x (остання 4.1.0.4) | від 8.1 | працює |
| PrestaShop 1.7 / 8.x | 7.2.5 - 8.1 | не встане: 8.3 вище за межу |
| PrestaShop 9.x (остання 9.1.5) | 8.1 - 8.5 | працює |
OpenCart 3.0.3.7 і 3.0.3.8 у мене живуть на PHP 8.3 на кількох бойових магазинах. Ядро поводиться нормально, а проблеми, коли вони є, приходять із модулів, написаних під PHP 7: застарілі конструкції там тепер дають фатальну помилку, і сторінка оформлення замовлення віддає 500 саме в той момент, коли покупець натискає «Підтвердити».
Чесно про обмеження: PHP 7.4 на сервері зараз немає, лише 8.3. Якщо ваш магазин прив'язаний до старої гілки й оновлювати його поки не планується, напишіть мені в підтримку в Telegram версію CMS і список модулів до оплати - скажу прямо, чи переїзд пройде без переписування.
2. Розширення PHP: що має бути ввімкнено
OpenCart на кроці перевірки вимагає curl, gd, zip і mbstring. PrestaShop 9 вибагливіший: до цього списку він додає intl, dom, fileinfo, iconv, simplexml і openssl. Найчастіше на дешевих серверах бракує саме intl - без нього PrestaShop не форматує ціни й дати, і установник зупиняється на першому ж кроці.
На PHP 8.3 у Hosturm усе це ввімкнено за замовчуванням, окремо просити не треба. Два розширення, про які магазини згадують запізно:
- ionCube Loader - частина платних модулів для OpenCart (оплата, доставка, обмін з 1С) поширюється закодованою. Без лоадера модуль не запускається зовсім. На сервері він стоїть.
- imagick і redis - перше потрібне модулям, які ріжуть і стискають фото товарів якісніше за GD, друге - модулям кешування. Обидва є.
База - MariaDB 10.11, вона закриває вимоги обох рушіїв (MySQL 5.7 / MariaDB 10.4 і новіші) із запасом.
3. Ліміти PHP, які ламають магазин без повідомлень
Це найпідступніша частина. Заводські значення PHP розраховані на невеликі сайти, і магазин на них формально працює - доки ви не збережете товар із двадцятьма опціями чи не завантажите архів шаблону. Ось що стоїть на сервері за замовчуванням і що з цим робити:
| Параметр | За замовчуванням | Що ламається | Рекомендую |
|---|---|---|---|
max_input_vars | 1000 | товар із багатьма опціями чи мовами зберігається частково, права груп користувачів в OpenCart «злітають» | 10000 |
memory_limit | 128M | імпорт прайсу, генерація мініатюр, біла сторінка в адмінці PrestaShop | 256M |
upload_max_filesize | 2M | не завантажується архів модуля, шаблону чи великого фото | 64M |
post_max_size | 8M | форма з кількома фото відправляється порожньою | 64M, не менше за попередній |
max_execution_time | 30 с | імпорт товарів обривається на середині | 300 с |
Найгірший із цих п'яти - max_input_vars. PHP мовчки відкидає все, що не влізло в ліміт, адмінка показує «Успішно збережено», а половина варіантів товару зникає. Власник помічає це через тиждень, коли покупець не може обрати розмір.
Як змінити: файл .user.ini
Сайти на сервері працюють через PHP-FPM, тому налаштування задаються файлом .user.ini у корені магазину (поруч з index.php). Створіть його у файловому менеджері DirectAdmin і впишіть рядки:
memory_limit = 256Mupload_max_filesize = 64Mpost_max_size = 64Mmax_input_vars = 10000max_execution_time = 300
PHP перечитує цей файл раз на 5 хвилин, тож зміни застосуються не миттєво - не поспішайте вирішувати, що «не спрацювало». Перевірити можна через тимчасовий файл із phpinfo(), який потім обов'язково видаліть.
Не вписуйте php_value у .htaccess, як радять старі інструкції для OpenCart. Ця директива існує лише для mod_php, якого на сервері немає, і Apache на неї відповідає помилкою 500 на всьому сайті.
4. Процесор: де магазин упирається першим
Блог можна майже повністю віддавати з кешу. Магазин - ні: кошик, фільтри, пошук, особистий кабінет і оформлення замовлення щоразу збираються наново, бо в кожного покупця вони свої. Тому навантаження тут залежить не від кількості товарів, а від того, скільки людей одночасно клацає фільтри.
Дві речі, які я бачу на магазинах найчастіше:
- Боти в фільтрах. Фільтр із п'ятьма параметрами породжує тисячі комбінацій адрес, і пошукові та цінові боти обходять їх усі. Заборона параметрів фільтра в
robots.txtчасто знімає третину навантаження за один вечір. - Модулі «хто зараз на сайті» і статистика в адмінці - пишуть у базу на кожен перегляд сторінки.
Одночасно на акаунті працює до 10 PHP-процесів. Якщо сторінка магазину збирається за пів секунди, цього вистачає на десятки покупців, які одночасно гортають каталог, без черги. Коли процеси закінчуються, запити стають у чергу, а далі приходить лист про перевищення лімітів - що з ним робити, я розписав у статті «Перевищено ліміт ресурсів»: що це означає і що робити.
5. База даних росте не від товарів
Каталог на 3000 товарів - це 50-150 МБ у базі. А от службові таблиці ростуть без обмежень, якщо їх ніхто не чистить:
- у PrestaShop -
ps_connections,ps_guestіps_pagenotfound: статистика відвідувань, яка за рік легко набирає кілька гігабайтів; - в OpenCart -
oc_sessionі журнал пошукових запитів, якщо його ввімкнено; - в обох - покинуті кошики гостей.
Роздута база уповільнює все, включно з резервним копіюванням, і з'їдає місце тарифу. Раз на квартал подивіться розмір таблиць у phpMyAdmin - сортування за розміром одразу покаже, що росте.
6. Cron: без нього половина функцій магазину стоїть
Оновлення курсів валют, вивантаження фіду для маркетплейсів і Google Merchant, розсилки про покинутий кошик, синхронізація залишків - усе це запускається за розкладом. OpenCart 4 має власний планувальник завдань в адмінці, PrestaShop - модуль Cron tasks manager, але обом потрібне системне завдання, яке смикає їх регулярно.
У DirectAdmin це розділ «Cron Задачі»: одна команда раз на 5-15 хвилин. Частіше ставити не варто - кожен запуск займає PHP-процес, і на невеликому тарифі це помітно в години піку.
7. Який тариф під який магазин
Цифри нижче - з таблиці порівняння на головній, ціна вказана за річної оплати. Якщо платити помісячно, Старт обійдеться в 479 грн, Pro - у 1 119 грн.
| Параметр | Старт | Оптимал | Бізнес | Pro |
|---|---|---|---|---|
| Ціна за річної оплати | 142 грн/міс | 229 грн/міс | 350 грн/міс | 800 грн/міс |
| Ядра CPU / RAM | 1 / 2 GB | 2 / 3 GB | 3 / 4 GB | 4 / 8 GB |
| NVMe | 10 GB | 20 GB | 30 GB | 100 GB |
| Сайтів / баз MySQL | 1 / 5 | 3 / 10 | 5 / 20 | 10 / без обмежень |
| Поштових скриньок | 15 | 25 | 50 | без обмежень |
| Під який магазин | один магазин до 500 товарів | магазин + тестова копія | 500-5000 товарів, реклама | кілька магазинів або понад 5000 товарів |
Про місце: сам рушій OpenCart займає десятки мегабайтів, PrestaShop - кілька сотень ще до першого товару. Основний об'єм дають фото: обидві CMS зберігають кожне зображення товару в кількох розмірах (у стандартній темі PrestaShop це п'ять копій плюс оригінал), тож 2000 товарів по три фото - це легко 5-8 GB. Для такого каталогу 10 GB Старту вже впритул.
Тестова копія магазину - звичка, яка окупається першим же невдалим оновленням модуля. Але вона займає окремий сайт і окрему базу, тому з нею Старт перестає підходити формально, а не за потужністю. Детальніше підбір під каталог і розпродажі розписаний на сторінці хостинг для OpenCart і PrestaShop, повний перелік планів - на сторінці тарифів. Тариф підвищується в кабінеті без переїзду, тому перед сезоном його піднімають за день-два до сплеску, а не в розпал.
8. Встановлення - і де немає «одного кліку»
Автоустановника застосунків у панелі зараз немає, тож магазин ставиться вручну. Це 15-20 хвилин:
- Створіть базу даних і користувача в DirectAdmin (розділ «Бази даних MySQL»), збережіть пароль.
- Завантажте архів CMS в
public_htmlі розпакуйте його у файловому менеджері - по одному файлу через FTP це займе годину. Обидва способи порівняно в статті FTP чи файловий менеджер. - Увімкніть SSL для домену до запуску установника, щоб адреса магазину одразу записалась з
https://. - Відкрийте домен у браузері й пройдіть установник: він сам перевірить PHP і розширення.
- Видаліть теку
install. PrestaShop додатково перейменовує теку адмінки на випадкову назву - запишіть її.
Якщо магазин уже працює деінде, ставити нічого не треба: перенесення роблю сам і безкоштовно, з перевіркою кошика й оплати до перемикання DNS. Як це відбувається без простою, описано в статті «Як перенести сайт на інший хостинг без простою».
Чек-лист перед оплатою
- Дізнайтесь точну версію свого OpenCart чи PrestaShop - вона внизу адмінки.
- Звірте її з таблицею PHP вище. PrestaShop 8 і старіший - спершу план оновлення.
- Випишіть модулі оплати й доставки та перевірте, чи їхні автори заявляють підтримку PHP 8.3.
- Порахуйте сайти: магазин, тестова копія, лендінг акції - кожен займає окреме місце в ліміті.
- Оцініть розмір теки з фото і бази - від цього залежить, чи вистачить 10 GB.
- Одразу після запуску створіть
.user.iniз лімітами з розділу 3. - Налаштуйте cron до того, як підключати фіди й розсилки.
- Перевірте, що щоденні бекапи лежать поза сервером, і зробіть ручну копію перед першим оновленням модулів.
Підсумок
Хостинг для OpenCart і PrestaShop - це в першу чергу правильна версія PHP, повний набір розширень і розумні ліміти, а вже потім ядра та гігабайти. Більшість «повільних» магазинів насправді впираються в заводський max_input_vars, ботів у фільтрах і нечищену статистику в базі, а не в тариф. Якщо ваш магазин на WordPress і WooCommerce, вимоги там інші - вони в статті «Хостинг для WordPress: що має бути в тарифі».
Порівняти плани можна в блоці тарифів на головній. Для першого магазину без тестової копії достатньо тарифу Старт. Сумніваєтесь щодо версії CMS чи модулів - надішліть їх у Telegram, подивлюсь до того, як ви заплатите.