Документація

Вимоги до сервера

Який потрібен PHP, база даних, розширення та права на файли. І що буває, коли хостинг закриває зайве.

На цій сторінці

Магазин працює на звичайному хостингу з PHP та MySQL — окремий сервер і права адміністратора потрібні не завжди. Нижче перелічено те, що магазин перевіряє сам під час встановлення, тож звіряти список вручну не обов’язково: встановлювач покаже позначки навпроти кожного пункту.

PHP

Потрібна версія 8.3 або новіша. На 8.4 магазин теж працює — це рекомендована версія, якщо хостинг її пропонує.

Розширення PHP, без яких магазин не запускається:

Розширення Навіщо
pdo, pdo_mysql зв’язок із базою даних
mbstring тексти українською та російською
openssl захищені з’єднання, паролі, платіжні шлюзи
tokenizer, ctype, json робота самого застосунку
fileinfo завантаження файлів і зображень
gd розміри фотографій товарів
curl зв’язок зі службами доставки, платіжними системами та нашим сайтом
dom, xml вивантаження, прайс-листи, обмін із маркетплейсами
zip встановлення доповнень і резервні копії
intl ціни, дати й числа у звичному для країни вигляді
bcmath точний підрахунок грошей
sodium перевірка підпису оновлень

Жорстких вимог до налаштувань PHP магазин не висуває — за витратами пам’яті він стежить сам і не бере наступне завдання, коли її залишається мало. Але на тісному хостингу працювати помітно зручніше, якщо підняти три значення: memory_limit до 256 МБ, max_execution_time до 60 секунд, а upload_max_filesize і post_max_size — до розміру найбільшої фотографії, яку ви збираєтесь завантажувати. Поточні значення видно в панелі керування: «Системний» → «Інформація про систему».

База даних

MySQL 8.0 або MariaDB 10.6 і новіші. Кодування — utf8mb4.

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

В імені бази даних не повинно бути крапок. Крапка в імені ламає запити, і магазин перестане відкриватися одразу після встановлення.

Веб-сервер

Nginx або Apache. Коренем сайту має бути тека public, а не корінь магазину: так відвідувач не зможе звернутися до файлів налаштувань напряму.

Головне правило для nginx — те саме, що й у будь-якого застосунку на Laravel:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

Воно майже завжди стоїть за замовчуванням. Без нього магазин не зможе домальовувати відсутні розміри фотографій: файл на диску є, а запит до магазину не доходить.

Для Apache налаштовувати нічого не треба — правила вже лежать у файлі .htaccess усередині теки public.

Приклад налаштування сайту в nginx

Так налаштовано наш демонстраційний магазин. Шляхи та адресу замініть на свої, решту можна брати як є.

server {
    listen 80;
    listen 443 ssl;
    http2 on;
    server_name shop.example.com;

    # Корінь сайту — тека public усередині магазину, а не сам магазин
    root /www/wwwroot/shop.example.com/public;
    index index.php;

    ssl_certificate     /шлях/до/сертифіката/fullchain.pem;
    ssl_certificate_key /шлях/до/сертифіката/privkey.pem;

    # Увесь трафік захищеним з’єднанням: адреси листів і зворотні адреси
    # платіжних систем мають збігатися з адресою сайту
    if ($server_port !~ 443) {
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

    # Стільки магазин зможе прийняти за один раз — фотографії товарів
    # та архіви доповнень упираються саме в це значення
    client_max_body_size 50m;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ [^/]\.php(/|$) {
        try_files $uri =404;
        fastcgi_pass unix:/tmp/php-cgi-84.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    # Службові файли назовні не віддаємо: у .env лежать паролі
    location ~ ^/(\.user\.ini|\.htaccess|\.git|\.env|\.svn|LICENSE|README\.md) {
        return 404;
    }

    # Зображення та стилі хай лежать у браузері, а не запитуються щоразу
    location ~* \.(gif|jpe?g|png|webp|avif|svg|ico)$ {
        expires 30d;
        access_log off;
    }

    location ~* \.(js|css)$ {
        expires 12h;
        access_log off;
    }

    access_log /www/wwwlogs/shop.example.com.log;
    error_log  /www/wwwlogs/shop.example.com.error.log;
}

Адреса сокета PHP (fastcgi_pass) у кожного хостингу своя: на панелях це зазвичай /tmp/php-cgi-84.sock, на власному сервері — /run/php/php8.4-fpm.sock. Подивіться, як налаштовані сусідні сайти, і візьміть таку саму.

Не підмінюйте сторінку 404 засобами сервера. Панелі хостингу часто додають error_page 404 /404.html і вмикають fastcgi_intercept_errors. Тоді замість сторінки «товар не знайдено», намальованої в оформленні магазину, відвідувач побачить стандартну сторінку сервера — і піде із сайту, замість того щоб повернутися до каталогу.

Якщо сайтом керує панель хостингу, редагуйте налаштування в панелі, а не у файлі: панель перезаписує свої файли за будь-якої зміни сайту, і правка, зроблена руками, тихо зникне.

Права на файли

Теки, до яких магазин пише:

  • storage — фотографії, вивантаження, журнали, резервні копії;
  • bootstrap/cache — службові файли;
  • файл .env — налаштування підключення (у нього пише встановлювач).

Усі файли магазину мають належати тому самому користувачу, від імені якого працює веб-сервер. Найчастіша причина «фотографії не відкриваються» — завантаження файлів на сервер від імені root, після чого сайт не може їх прочитати.

Фотографії та тека storage

Товари лежать у сховищі, а відвідувач отримує їх за адресою public/storage — це посилання на сховище. Магазин створює його сам під час встановлення. Якщо хостинг забороняє такі посилання, встановлювач скаже про це й покаже команду:

php artisan storage:link

Доки посилання немає, у магазині не відкривається жодне зображення: фотографії на місці, а покупець бачить порожні рамки.

Планувальник завдань

Магазину потрібен один рядок у планувальнику (cron) — про нього окрема сторінка, Обслуговування. Без нього магазин працює, але не йдуть листи покупцям, не виконуються вивантаження та імпорт, не застосовуються оновлення.

Обмеження хостингу

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

  • proc_open — запуск окремих програм. Без нього магазин виконує завдання всередині свого процесу. Єдине, що справді перестає працювати, — автоматичні копії бази даних: їх знімає окрема програма сервера.
  • pcntl_signal — сигнали процесів. Магазин ними не користується: чергу розбирає власна команда, яка працює й без них.
  • symlink — посилання на теки. Доки доступ до фотографій відкрито, це просто до відома; якщо посилання немає і створити його не можна — фотографії не з’являться.

Що саме закрито на вашому сервері, завжди видно в панелі керування: розділ «Системний» → «Діагностика».

Оновлено 7 серпня 2026