Многие думают, что для сайта нужен фреймворк: Laravel, Symfony, Yii. Мол, без них никак. Это неправда. Простой сайт на чистом PHP работает быстрее, легче и надёжнее любого фреймворка. Разберём по шагам — что нужно знать и как построить свой сайт без зависимостей.
Что такое «сайт на чистом PHP»
Это сайт, в котором:
- Нет composer и сторонних библиотек
- Нет фреймворка и его слоёв абстракции
- Нет сборщиков, npm, node_modules
- Только PHP + MySQL + HTML + CSS + чуть-чуть JS
Такой сайт работает на любом хостинге за 200 ₽/мес. Не требует VPS, Docker, CI/CD. Загрузил по FTP — работает.
Минимальный стек
| Что | Чем закрывается |
|---|---|
| Backend | PHP 8.1+ |
| База данных | MySQL / MariaDB через PDO |
| Frontend | HTML5 + CSS3 + ванильный JS |
| Веб-сервер | Apache с mod_rewrite |
| Хостинг | Shared, от 200 ₽/мес |
Шаг 1. Структура проекта
/public_html/
├── index.php ← главная
├── about.php ← другие страницы
├── contact.php
├── includes/
│ ├── config.php ← настройки, подключение к БД
│ ├── header.php
│ └── footer.php
├── .htaccess ← правила ЧПУ
└── assets/
├── css/style.css
└── js/script.js
Шаг 2. Подключение к базе
Создаём includes/config.php:
<?php
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'user',
'pass',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
Важно: EMULATE_PREPARES = false — без этого prepared statements работают небезопасно.
Шаг 3. Первая страница
<?php require_once __DIR__ . '/includes/config.php'; $pageTitle = 'Главная'; require_once __DIR__ . '/includes/header.php'; ?> <h1>Привет, мир!</h1> <?php require_once __DIR__ . '/includes/footer.php';
Шаг 4. Красивые URL через .htaccess
RewriteEngine On
# /about/ → /about.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9\-]+)/?$ $1.php [L]
Теперь /about/ открывает about.php.
Шаг 5. Работа с данными
Пример: вывести список статей блога.
<?php
$stmt = $pdo->query("SELECT id, title, slug FROM blog WHERE status = 1");
$posts = $stmt->fetchAll();
?>
<ul>
<?php foreach ($posts as $post): ?>
<li><a href="/blog/<?= $post['slug'] ?>/"><?= htmlspecialchars($post['title']) ?></a></li>
<?php endforeach; ?>
</ul>
Всё просто. Никаких ORM, никаких ActiveRecord. Один запрос — один результат.
Шаг 6. Безопасность
Минимум, что нужно сделать в любом случае:
- PDO prepared statements — от SQL-инъекций
- htmlspecialchars() при выводе — от XSS
- CSRF-токен на всех формах — от CSRF
- session_set_cookie_params() с secure, httponly, samesite
- .htaccess Require all denied на служебные папки
- Заголовки безопасности — HSTS, X-Frame-Options, X-Content-Type
Шаг 7. Когда нужен фреймворк
Фреймворк нужен, когда:
- Команда 10+ разработчиков
- Много интеграций и API
- Нужны очереди, консольные команды, тесты
- Сложная бизнес-логика (CRM, ERP)
Для обычного сайта-визитки, блога, каталога, лендинга — фреймворк лишний.
Что делать дальше
Можно собрать свой мини-движок по такому принципу за 2-3 дня. Это базовые 200-300 строк кода: роутинг, шаблоны, БД, авторизация, формы.
Если не хочешь изобретать велосипед — готовые самописные CMS уже собирают всю эту рутину. Например, Kuznya CMS — сделан на том же принципе, что описано выше: чистый PHP, без фреймворков, без Composer.