Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
10.9K subscribers
1.6K photos
27 videos
26 files
4.35K links
Все самое полезное для пхпшника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/bca892d6

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
🧠 Монолит или Web API? Проверим на практике

Представьте ситуацию 👇
Вы начинаете новый PHP-проект с нуля.
Есть бизнес-идея, сроки поджимают, команда не бесконечная.

Вопрос не теоретический — архитектурный.

👉 Какой подход вы выберете и почему?

🅰️ Монолит
Быстрее старт
Проще деплой
Меньше инфраструктурного шума

🅱️ Web API + клиент
Чёткие контракты
Готовность к мобильным приложениям
Проще масштабировать команды

🅾️ Модульный монолит (гибрид)
Один репозиторий
Внутренние API/DTO
Возможность без боли выделить API позже

🅿️ Зависит от контекста
Размер команды
Тип продукта
Планируемый рост

Условия (чтобы было честно):
PHP (Laravel / Symfony — не важно)
1–2 месяца на MVP
Возможен рост продукта, но не гарантирован
Продакшн, а не pet-project

💬 Напишите в комментариях:
1️⃣ Что выберете первым шагом
2️⃣ При каком триггере поменяете архитектуру
3️⃣ Какой самый болезненный опыт у вас был: с монолитом или с API

#элементарный_выбор

Библиотека пхпшника
Loupe

Полнотекстовая поисковая система с токенизацией, стеммингом, устойчивостью к опечаткам, фильтрами и географической поддержкой, основанная на чистом PHP и SQLite.

🔗 Github

Библиотека пхпшника

#инструменты
🧹 How-to: навести порядок в PHP-проекте с PHP CS Fixer

PHP CS Fixer — инструмент, который автоматически приводит код к единому стилю.
Он убирает хаос с отступами, кавычками, импортами и форматированием — и делает код читаемым и предсказуемым для всей команды.

Зачем нужен единый стиль
👀 Читаемость — код воспринимается быстрее, без лишней когнитивной нагрузки
🤝 Code review без споров — больше никаких обсуждений табов и скобок
🧱 Поддерживаемость — код выглядит так, будто у него один автор
🚀 Быстрый онбординг — новички не привыкают к «местным традициям»
🐛 Меньше ошибок — отклонения от нормы сразу бросаются в глаза

Почему именно PHP CS Fixer
единые правила для всей команды
автоматическое исправление стиля
экономия времени на ревью
профессиональный, индустриальный вид кода

Как начать
1. Добавьте PHP CS Fixer как dev-зависимость
2. Создайте конфигурацию в корне проекта
3. Используйте безопасные правила без изменения поведения кода
4. Исключите служебные и vendor-директории

Лучший старт — стандарт PSR-12 с минимальными дополнениями.

Как встроить в работу
Подход 1: форматирование отдельным коммитом
Сначала логика — потом единый коммит со стилем. История остаётся чистой.
Подход 2: контроль через CI/CD
Пайплайн проверяет стиль и подсказывает разработчику, что нужно поправить до merge.

👉 Medium

Библиотека пхпшника
⌨️ Топ-вакансий по PHP за неделю

PHP-разработчик — от 180 000 до 250 000 ₽, Удалёнка (Москва)

Middle FullStack Developer (PHP / Laravel / Vue) — от 150 000 ₽, Удаленка (Москва)

Middle / Senior PHP Developer — Договорная, Удалёнка/Офис (Кипр)

➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
MoonShine 4: AI-инструменты, Tailwind 4 и новый UI — большой разбор релиза open source админ панели

Tailwind 4, дизайн-токены, AI-генерация через Claude Code, Telegram Mini App, модульная архитектура CRUD, 20+ палитр из коробки и генератор собственных. MoonShine 4 большое обновление админ панели для проектов на Laravel и других фреймворках. Вместо часов настройки полей — один промпт. Вместо танцев с CSS — система дизайн-токенов. Вместо мобильного приложения — интеграция с Telegram. За 11 месяцев разработки было переосмыслено то, как должна создаваться админ-панель в 2025 году. Внутри — полный технический разбор.

🔗 Хабр

Библиотека пхпшника
8👍1
🧠 Продвинутый кеш для запросов и HTTP-ответов

1) Кеширование данных/результатов запросов в Laravel
Laravel предоставляет единый API для работы с кешем — Redis, Memcached, DynamoDB, файл-драйвер и другие хранилища доступны «из коробки».
Это позволяет кешировать результаты тяжёлых запросов или вычислений, чтобы не выполнять их повторно при каждом HTTP-запросе.
Пример:


use Illuminate\Support\Facades\Cache;

$products = Cache::remember('products.active', 3600, function () {
return Product::where('active', true)->get();
});


🔹 remember() проверяет наличие ключа в кеше → если нет — выполняет запрос, сохраняет результат → использует кеш до истечения TTL (в секундах).

2) Полное кеширование HTTP-ответов (Response Cache)
Для страниц или API-эндпоинтов, результат которых редко меняется, можно кешировать весь HTTP-ответ. Это значит: тот же запрос не будет обрабатываться Laravel/Symfony — ответ будет браться из кеша.

🤝 Laravel
Существуют готовые пакеты (например, spatie/laravel-responsecache), которые автоматически кешируют весь ответ для GET-запросов:

composer require spatie/laravel-responsecache

Пакет будет сохранять ответы и отдавать кешированные данные без обработки контроллера.
📍 Это даёт максимальное ускорение на страницах/эндпоинтах, которые не зависят от частых изменений — например, список товаров, главные страницы, публичные API.

3) HTTP-кеширование через заголовки
Можно использовать HTTP-кеширование на уровне клиента и прокси: браузеры или CDN будут хранить ответы и не обращаться к серверу.
Пример установки заголовков в Laravel:


return response()->json($product)
->header('Cache-Control', 'public, max-age=3600')
->setEtag(md5($product->updated_at));


🔹 Cache-Control указывает, как долго браузер/CDN может хранить ответ.
🔹 ETag позволяет клиенту проверить, изменился ли ресурс, без загрузки полного тела ответа.

📈 Такой подход особенно эффективен для API с часто повторяющимися запросами — уменьшает количество запросов к серверу и снижает нагрузку на процессор и базу.

4) HTTP-кеширование в Symfony
Symfony поддерживает стандартизированное HTTP-кеширование (RFC 7234): можно настраивать TTL, validation-кеш, работу через обратные прокси.
Пример для компонента Symfony:


$response = new Response($content);
$response->setSharedMaxAge(3600); // кеш прокси
return $response;


🔹 Symfony может работать с reverse proxy (gateway cache), например с Varnish или встроенным HttpCache, что позволяет обходить приложение полностью при совпадении кеша.

📦 Такой кеш особенно полезен для статичных страниц, публичных API или фрагментов, которые долго остаются неизменными.

5) Низкоуровневые кеш-стратегии
Помимо кеширования данных и ответов, можно:
🔹 кешировать вычисления, агрегации и подготовленные отчёты;
🔹 кешировать результаты внешних API-вызовов, чтобы не дергать их при каждом запросе;
🔹 кешировать конфигурацию/маршруты, чтобы уменьшить накладные расходы на bootstrap.

🧠 Когда это эффективно
Высокая нагрузка на API/сервер
Часто повторяющиеся запросы к одним и тем же данным
Страницы, результаты поиска, публичные каталоги
Обслуживание данных, которые редко меняются

⚠️ Что важно учитывать
⚠️ Если данные меняются часто — кеш нужно инвалидировать своевременно
⚠️ Неразумное кеширование может привести к устаревшим ответам
⚠️ Не все маршруты подходят для полного HTTP-кеша — динамические, приватные, зависящие от сессии должны быть исключены

Библиотека пхпшника
1
🐘 PHP для начинающих: зачем нужен php artisan и как им пользоваться

php artisan — это CLI-интерфейс Laravel, который ускоряет разработку:
он генерирует код, управляет БД, помогает с отладкой и обслуживанием проекта.
Если вы работаете с Laravel и не используете artisan — вы тратите время впустую.

1️⃣ Контроллеры
🔹 Обычный контроллер

php artisan make:controller UserController

Что делает: создаёт пустой контроллер
Когда использовать: нужен полный контроль над методами

🔹 Resource-контроллер (CRUD)

php artisan make:controller UserController --resource

Создаёт методы:
index, create, store, show, edit, update, destroy
Идеально для: MVC-приложений

Работает в паре с:

Route::resource('users', UserController::class);

🔹 API Resource-контроллер

php artisan make:controller UserController --api

Без create() и edit()
Для: REST API (JSON, Sanctum, JWT)

🔹 Invokable-контроллер

php artisan make:controller LoginController --invokable

Один метод __invoke()
Для: одного действия, чистые роуты

2️⃣ Представления (Blade)
🔹 View

php artisan make:view about

Создаёт resources/views/about.blade.php

🔹 Blade-компонент

php artisan make:component About

Для: переиспользуемых UI-элементов
Пример:

<x-about />

3️⃣ Модели и база данных
🔹 Модель

php artisan make:model Course

Часто используемые флаги:

-m — migration

-f — factory

-s — seeder

-a — всё сразу

🔹 Информация о модели (Laravel 10+)

php artisan model:show Course

Показывает таблицу, поля, связи, casts
Очень полезно для отладки

4️⃣ Миграции

php artisan make:migration create_posts_table
php artisan migrate
php artisan migrate:rollback --step=3
php artisan migrate:reset ⚠️ удаляет все таблицы
php artisan migrate:refresh

Запуск конкретной миграции:

php artisan migrate --path=/database/migrations/xxxx.php

5️⃣ Seeders (данные)

php artisan make:seeder TeachersSeeder
php artisan db:seed --class=TeachersSeeder

Для: тестовых и стартовых данных

6️⃣ Валидация и middleware

php artisan make:rule Uppercase
php artisan make:middleware CheckRole

Используется для:
валидации, авторизации, фильтрации запросов

7️⃣ Аутентификация и API

php artisan install:api

Устанавливает Laravel Sanctum и API-авторизацию

php artisan make:provider AuthServiceProvider

Gates и Policies

8️⃣ Почта

php artisan make:mail WelcomeMail

Emails и уведомления

9️⃣ Настройка и обслуживание

php artisan key:generate обязательно после clone
php artisan storage:link доступ к storage
php artisan down
php artisan down --secret=token
php artisan up

🔟 Роутинг и отладка

php artisan route:list
php artisan route:list --except-vendor

Для: поиска конфликтов и middleware

1️⃣1️⃣ Локализация и stubs

php artisan lang:publish
php artisan stub:publish

Stubs — шаблоны для make: команд
Можно кастомизировать стиль проекта

1️⃣2️⃣ Кэш и оптимизация

php artisan optimize
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:clear

Для продакшена и странных багов

1️⃣3️⃣ Очереди и задачи

php artisan make:job SendEmailJob
php artisan queue:work

1️⃣4️⃣ Policies

php artisan make:policy CoursePolicy --model=Course

1️⃣5️⃣ Tinker (обязательно знать)

php artisan tinker

Интерактивный REPL
Можно выполнять Laravel-код, запросы, сервисы прямо в консоли

Библиотека пхпшника

#php_азбука
👍4🥱31
Совет по Laravel: Порционное удаление данных

💬Если удаляете много записей из таблицы, делайте это частями и с паузами, чтобы не завалить базу данных.

Библиотека пхпшника


#vardump
👍7🤔1
Какое значение по умолчанию принимает директива memory_limit в PHP?

Правильный ответ лежит в канале задач
🌚1
📚 Grokking Relational Database Design (2025)

Эта книга — как дружелюбное и наглядное введение в проектирование реляционной базы без боли, внутри которого тебя ждет:

🔹 SQL без лишней воды. Как создавать таблицы, писать запросы и не сломать всё одной командой.

🔹 Проектирование базы с нуля. Что хранить, где хранить, как правильно назвать таблицы и поля.

🔹 Нормализация без страшных терминов. Минимум дублей, минимум аномалий, максимум структуры.

🔹 Практика на реальном проекте. Будешь проектировать и оптимизировать базу под e-commerce — от схемы до запросов.

🔹 Генеративный ИИ в помощь. Как делегировать рутину: описания сущностей, черновики схем, проверки связей.

🔹 Производительность и безопасность. Почему индексы — не украшение схемы, а обязательная часть. И как не создать дыру в доступах одним неверным GRANT’ом.

Эта книга не грузит теорией ради теории. Она объясняет, как базы работают на практике, и помогает собрать ту самую «правильную» структуру, которая выдержит рост приложения.

🔗 Скачать

🔹
Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Книги для программистов | Поддержать бустом
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Совет по Laravel 💡: Используйте события повторной привязки для обновления зависимостей

Когда привязанный экземпляр в контейнере Laravel привязывается заново, запускается событие повторной привязки. Вы можете прослушивать это событие, чтобы обеспечить актуальность классов, использующих этот экземпляр. Это можно сделать с помощью метода rebinding() или просто с помощью команды refresh 🚀

Библиотека пхпшника

#vardump
👍1
Symfony 7.4 — наконец-то без костылей

Иногда релиз фреймворка — это «косметика перед следующей мажорной версией».
Symfony 7.4 — не из таких.
Этот релиз закрывает старые, раздражающие проблемы, с которыми все давно смирились. И
делает это аккуратно, системно и по-взрослому.

🎥 Видео — больше не боль
Если вы когда-либо валидировали видео, вы знаете этот путь:
File → Image → кастомный валидатор → ffmpeg → боль.

В 7.4 появился #[Assert\Video] — и всё стало нормально.
Теперь можно одной аннотацией проверить:
🔸формат и MIME
🔸вес файла
🔸разрешение и ориентацию
🔸соотношение сторон
🔸длительность
🔸контейнеры и кодеки
🔸битые файлы ещё до бизнес-логики

Никакой логики в контроллере.
Никаких «проверим потом».
Видео либо валидно — либо сразу нет.

🧩 Консоль, которую приятно писать
Symfony Console всегда был сильным, но шумным.
В 7.4 его реально упростили.

Enum прямо в аргументах
Не строка, не if-else — нормальный BackedEnum.

DTO через #[MapInput]
Аргументы команд наконец выглядят как структура, а не мешок параметров.

#[Ask] и #[Interact]
Интерактив описывается декларативно, без ручных вопросов в коде.
CLI теперь пишется так же аккуратно, как контроллеры.

🧹 Request без магии
Старый Request::get() был удобным… и опасным.
Он угадывал, откуда брать данные. Иногда — не так, как вы ожидали.
В 7.4 его депрекейтнули. И это правильное решение.
Теперь вы всегда знаете:
1. откуда пришли данные
2. почему они именно такие
3. где искать баг

Плюс — на PHP 8.4 Symfony нормально парсит PUT/PATCH/DELETE с телом запроса. Без хака, без костылей, без сюрпризов.

📦 var/share — мелочь, которая сильно упрощает жизнь
Раньше:
кеш
шареные данные
временные файлы
всё лежало рядом.

Теперь:
var/cache — локально, быстро, одноразово
var/share — переживает деплой, масштабирование, рестарты
Если вы используете Docker или Kubernetes — вы сразу почувствуете разницу.

Атрибуты вместо ритуалов
Symfony продолжает двигаться к коду без «обвязки»:
#[IsSignatureValid] — подписанные URL без сервисов
#[CurrentUser] с union-типами
нативный HTML5-парсер из PHP 8.4
Быстрее. Точнее. Без libxml-наследия.
Ничего не нужно настраивать — просто становится лучше.

👉 Читать статью

Библиотека пхпшника
🔥62👏2
От 45 мс до 8 мс: тестирование Symfony 7.4 на FrankenPHP

Больше десяти лет PHP-стек выглядел одинаково: Nginx → FastCGI → PHP-FPM. Надёжно, привычно — и технологически застыло.
FrankenPHP ломает эту модель полностью.

FrankenPHP — это application server, встроенный прямо в Caddy. Без FastCGI, без прокси-прослоек и с ключевой фичей — Worker Mode.

В чём суть
В классическом PHP-FPM каждый запрос:

загружает autoload
поднимает Kernel
и тут же всё уничтожает

Для тяжёлых приложений на Symfony 7.4 это 30–100 мс чистых потерь на каждый запрос.

Что меняет FrankenPHP
Worker Mode загружает приложение один раз и держит его в памяти.
Результат:
🚀 3–4× рост RPS
P95 latency ~8 мс
🌐 HTTP/3, Early Hints, auto-HTTPS из коробки
🔴 встроенный Mercure без отдельного сервиса

Архитектура будущего
Один контейнер вместо nginx + php-fpm:
1. Docker
2. FrankenPHP
3. Symfony 7.4 LTS
4. real-time события без Redis и WebSocket-зоопарка

Важный нюанс
Worker Mode = общая память между запросами.
Stateful-сервисы — под строгий контроль. Symfony 7.4 решает это через ResetInterface, но архитектурное мышление придётся обновить.

Бенчмарк (AWS t3.medium)
Nginx + PHP-FPM: ~1 240 RPS / 45 мс
FrankenPHP Worker: ~3 850 RPS / 8 мс

PHP-FPM не «плохой» — он просто устарел.
Связка Symfony 7.4 + FrankenPHP — это новый дефолт для high-load и API-first проектов.
Если начинаете новый проект — выбирайте FrankenPHP сразу.
Если поддерживаете легаси — пора планировать миграцию.


👉 Читать статью

Библиотека пхпшника
👍6🥱3🌚1
Hi.Events

Опенсорс платформа для управления мероприятиями и продажи билетов

🔗 Github

Библиотека пхпшника

#инструменты
⚡️ How-to: serverless Symfony/PHP на AWS без Redis для сессий

У serverless есть ловушка: Lambda требует stateless, а PHP-сессии по умолчанию живут в файлах. В AWS Lambda это «песок»: инстанс исчез — сессия исчезла. Частый костыль — Redis/ElastiCache, но это уже VPC, обслуживание и лишние расходы. В статье предлагают более «чистый» вариант: хранить сессии и CSRF-токены в DynamoDB.

Идея простая: заменить файловый session handler на DynamoDB-backed, добавить TTL для авто-истечения и использовать Lambda Function URL (без API Gateway). В итоге приложение остаётся действительно serverless: масштабируется само, не требует инфраструктуры под Redis и платит «по факту». Отдельно разбираются single-table паттерны (сессии/CSRF/сущности в одной таблице), нюансы генерации URL в Symfony и честные компромиссы: cold start, стоимость на высоком стабильном трафике и гонки при параллельных вкладках.

🔗 Читать статью

Библиотека пхпшника
😁31🥱1🌚1