Коротка відповідь

  • 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 він просто відмовиться продовжувати.

Діапазони нижче я брав із самого коду установників, а не з маркетингових сторінок:

Гілка CMSPHP за установникомНа 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.x7.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_vars1000товар із багатьма опціями чи мовами зберігається частково, права груп користувачів в OpenCart «злітають»10000
memory_limit128Mімпорт прайсу, генерація мініатюр, біла сторінка в адмінці PrestaShop256M
upload_max_filesize2Mне завантажується архів модуля, шаблону чи великого фото64M
post_max_size8Mформа з кількома фото відправляється порожньою64M, не менше за попередній
max_execution_time30 сімпорт товарів обривається на середині300 с

Найгірший із цих п'яти - max_input_vars. PHP мовчки відкидає все, що не влізло в ліміт, адмінка показує «Успішно збережено», а половина варіантів товару зникає. Власник помічає це через тиждень, коли покупець не може обрати розмір.

Як змінити: файл .user.ini

Сайти на сервері працюють через PHP-FPM, тому налаштування задаються файлом .user.ini у корені магазину (поруч з index.php). Створіть його у файловому менеджері DirectAdmin і впишіть рядки:

memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_input_vars = 10000
max_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 / RAM1 / 2 GB2 / 3 GB3 / 4 GB4 / 8 GB
NVMe10 GB20 GB30 GB100 GB
Сайтів / баз MySQL1 / 53 / 105 / 2010 / без обмежень
Поштових скриньок152550без обмежень
Під який магазинодин магазин до 500 товарівмагазин + тестова копія500-5000 товарів, рекламакілька магазинів або понад 5000 товарів

Про місце: сам рушій OpenCart займає десятки мегабайтів, PrestaShop - кілька сотень ще до першого товару. Основний об'єм дають фото: обидві CMS зберігають кожне зображення товару в кількох розмірах (у стандартній темі PrestaShop це п'ять копій плюс оригінал), тож 2000 товарів по три фото - це легко 5-8 GB. Для такого каталогу 10 GB Старту вже впритул.

Тестова копія магазину - звичка, яка окупається першим же невдалим оновленням модуля. Але вона займає окремий сайт і окрему базу, тому з нею Старт перестає підходити формально, а не за потужністю. Детальніше підбір під каталог і розпродажі розписаний на сторінці хостинг для OpenCart і PrestaShop, повний перелік планів - на сторінці тарифів. Тариф підвищується в кабінеті без переїзду, тому перед сезоном його піднімають за день-два до сплеску, а не в розпал.

8. Встановлення - і де немає «одного кліку»

Автоустановника застосунків у панелі зараз немає, тож магазин ставиться вручну. Це 15-20 хвилин:

  1. Створіть базу даних і користувача в DirectAdmin (розділ «Бази даних MySQL»), збережіть пароль.
  2. Завантажте архів CMS в public_html і розпакуйте його у файловому менеджері - по одному файлу через FTP це займе годину. Обидва способи порівняно в статті FTP чи файловий менеджер.
  3. Увімкніть SSL для домену до запуску установника, щоб адреса магазину одразу записалась з https://.
  4. Відкрийте домен у браузері й пройдіть установник: він сам перевірить PHP і розширення.
  5. Видаліть теку install. PrestaShop додатково перейменовує теку адмінки на випадкову назву - запишіть її.

Якщо магазин уже працює деінде, ставити нічого не треба: перенесення роблю сам і безкоштовно, з перевіркою кошика й оплати до перемикання DNS. Як це відбувається без простою, описано в статті «Як перенести сайт на інший хостинг без простою».

Чек-лист перед оплатою

  1. Дізнайтесь точну версію свого OpenCart чи PrestaShop - вона внизу адмінки.
  2. Звірте її з таблицею PHP вище. PrestaShop 8 і старіший - спершу план оновлення.
  3. Випишіть модулі оплати й доставки та перевірте, чи їхні автори заявляють підтримку PHP 8.3.
  4. Порахуйте сайти: магазин, тестова копія, лендінг акції - кожен займає окреме місце в ліміті.
  5. Оцініть розмір теки з фото і бази - від цього залежить, чи вистачить 10 GB.
  6. Одразу після запуску створіть .user.ini з лімітами з розділу 3.
  7. Налаштуйте cron до того, як підключати фіди й розсилки.
  8. Перевірте, що щоденні бекапи лежать поза сервером, і зробіть ручну копію перед першим оновленням модулів.

Підсумок

Хостинг для OpenCart і PrestaShop - це в першу чергу правильна версія PHP, повний набір розширень і розумні ліміти, а вже потім ядра та гігабайти. Більшість «повільних» магазинів насправді впираються в заводський max_input_vars, ботів у фільтрах і нечищену статистику в базі, а не в тариф. Якщо ваш магазин на WordPress і WooCommerce, вимоги там інші - вони в статті «Хостинг для WordPress: що має бути в тарифі».

Порівняти плани можна в блоці тарифів на головній. Для першого магазину без тестової копії достатньо тарифу Старт. Сумніваєтесь щодо версії CMS чи модулів - надішліть їх у Telegram, подивлюсь до того, як ви заплатите.