ru
Feedback
Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter

Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter

Открыть в Telegram

Все самое полезное для пхпшника в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/bca892d6 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b

Больше
10 716
Подписчики
+124 часа
-107 дней
-3430 день
Привлечение подписчиков
июнь '26
июнь '26
+7
в 0 каналах
май '26
+57
в 1 каналах
Get PRO
апрель '26
+61
в 0 каналах
Get PRO
март '26
+54
в 0 каналах
Get PRO
февраль '26
+94
в 6 каналах
Get PRO
январь '26
+85
в 1 каналах
Get PRO
декабрь '25
+52
в 0 каналах
Get PRO
ноябрь '25
+65
в 0 каналах
Get PRO
октябрь '25
+73
в 1 каналах
Get PRO
сентябрь '25
+48
в 0 каналах
Get PRO
август '25
+63
в 2 каналах
Get PRO
июль '25
+90
в 0 каналах
Get PRO
июнь '25
+62
в 0 каналах
Get PRO
май '25
+89
в 2 каналах
Get PRO
апрель '25
+136
в 0 каналах
Get PRO
март '25
+167
в 52 каналах
Get PRO
февраль '25
+124
в 31 каналах
Get PRO
январь '25
+167
в 40 каналах
Get PRO
декабрь '24
+139
в 35 каналах
Get PRO
ноябрь '24
+200
в 38 каналах
Get PRO
октябрь '24
+200
в 38 каналах
Get PRO
сентябрь '24
+174
в 35 каналах
Get PRO
август '24
+179
в 36 каналах
Get PRO
июль '24
+188
в 35 каналах
Get PRO
июнь '24
+222
в 30 каналах
Get PRO
май '24
+226
в 35 каналах
Get PRO
апрель '24
+262
в 35 каналах
Get PRO
март '24
+279
в 29 каналах
Get PRO
февраль '24
+345
в 29 каналах
Get PRO
январь '24
+280
в 24 каналах
Get PRO
декабрь '23
+260
в 24 каналах
Get PRO
ноябрь '23
+512
в 8 каналах
Get PRO
октябрь '23
+246
в 22 каналах
Get PRO
сентябрь '23
+298
в 0 каналах
Get PRO
август '23
+274
в 0 каналах
Get PRO
июль '23
+229
в 0 каналах
Get PRO
июнь '23
+183
в 0 каналах
Get PRO
май '23
+326
в 0 каналах
Get PRO
апрель '23
+137
в 0 каналах
Get PRO
март '23
+290
в 0 каналах
Get PRO
февраль '23
+247
в 0 каналах
Get PRO
январь '23
+187
в 0 каналах
Get PRO
декабрь '22
+239
в 0 каналах
Get PRO
ноябрь '22
+235
в 0 каналах
Get PRO
октябрь '22
+169
в 0 каналах
Get PRO
сентябрь '22
+159
в 0 каналах
Get PRO
август '22
+199
в 0 каналах
Get PRO
июль '22
+265
в 0 каналах
Get PRO
июнь '22
+305
в 0 каналах
Get PRO
май '22
+158
в 0 каналах
Get PRO
апрель '22
+115
в 0 каналах
Get PRO
март '22
+197
в 0 каналах
Get PRO
февраль '22
+155
в 0 каналах
Get PRO
январь '22
+176
в 0 каналах
Get PRO
декабрь '21
+147
в 0 каналах
Get PRO
ноябрь '21
+137
в 0 каналах
Get PRO
октябрь '21
+180
в 0 каналах
Get PRO
сентябрь '21
+181
в 0 каналах
Get PRO
август '21
+207
в 0 каналах
Get PRO
июль '21
+216
в 0 каналах
Get PRO
июнь '21
+141
в 0 каналах
Get PRO
май '21
+274
в 0 каналах
Get PRO
апрель '21
+262
в 0 каналах
Get PRO
март '21
+240
в 0 каналах
Get PRO
февраль '21
+250
в 0 каналах
Get PRO
январь '21
+351
в 0 каналах
Get PRO
декабрь '20
+7 687
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
03 июня+1
02 июня+2
01 июня+4
Посты канала
🧠 Распознавание лиц на чистом PHP Если задача пилить аттенданс или авторизацию по лицу прямо внутри Laravel-монолита, тащить Python-микросервис избыточно. Расширение php-dlib подгружает модели Dlib и отдаёт 128-мерные эмбеддинги без посредников. Пайплайн на четыре шага — ставим расширение из релизов mailmug/php-dlib и прописываем путь в php.ini; — качаем три .dat-модели (детектор CNN, 5-point landmarks, ResNet recognition); — на этапе enroll прогоняем фото через детектор → ландмарки → дескриптор, сериализуем в faces.db; — на recognize считаем евклидово расстояние, порог 0.6 отсекает чужих. Ядро энролла:
$faces = $fd->detect($img);
$landmarks = $fld->detect($img, $faces[0]);
$descriptor = $fr->computeDescriptor($img, $landmarks);
$database[$name] = $descriptor;
Ландмарки тут не для красоты: без выравнивания по глазам дескриптор плывёт, и матчинг ловит ложные срабатывания на похожих лицах. 📂 Скачать исходники Библиотека пхпшника

2
#dev_meme
#dev_meme
1 117
3
⚡️ Продолжаем знакомить вас с экспертами курса AgentOps! — Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов:
⚡️ Продолжаем знакомить вас с экспертами курса AgentOps! — Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов: оптимизировать затраты на разработку и продакшен, внедрить model routing, semantic cache и систему алертов для контроля расходов — Эмиль Сатаев разберет Context Engineering: управление контекстом, защиту от prompt injection, работу с длинными контекстами и построение безопасного пайплайна входа для AI-систем — Михаил Бондаревский покажет, как подготовить инфраструктуру для AI-агентов: Docker, sandboxing, streaming, docker-compose и воспроизводимое окружение для разработки и продакшена — Мурат Хажгериев расскажет про Enterprise Integrations & MCP: когда MCP действительно нужен, как подключать внешние сервисы и реализовывать интеграции с OAuth2 delegation — Герман Сабиров разберет Governance & Compliance для AI-систем: data flow, audit logs, требования 152-ФЗ, локализацию данных и построение compliance-подхода на уровне архитектуры Курс для backend-разработчиков, тимлидов и LLM инженеров о том, как внедрять AI-логику в бэкенд IT-продуктов и сохранять стабильность сервиса. 👉 Изучить обновленную программу AgentOps и занять место.
1 167
4
Что возвращает метод Collection::pluck('name')?
1 197
5
🐳 Работа с Docker Compose Поменяли конфиг одного сервиса и не хотите перезапускать весь стек из 10 контейнеров? docker compose up -d --no-deps service-name пересоздаст только указанный сервис. 🔹 Зачем это нужно — Перезапуск одного сервиса вместо всего стека экономит минуты на тяжёлых проектах. — --no-deps не трогает зависимости, так что БД и Redis останутся на месте. — -d запускает в фоне, терминал свободен для другой работы. 🔹 Как использовать — Пересоздать один сервис: docker compose up -d --no-deps api — Пересобрать и запустить: docker compose up -d --no-deps --build api — Посмотреть логи только одного: docker compose logs -f api — Рестарт без пересоздания: docker compose restart api — Масштабировать: docker compose up -d --scale worker=3 💡 restart не подхватывает изменения в docker-compose.yml или Dockerfile, для этого нужен up -d. Если обновили env-переменные или порты — только up -d применит изменения. Библиотека пхпшника
1 384
6
#dev_meme
#dev_meme
1 328
7
⚡️ Последний шанс забрать курсы со СКИДКОЙ 40%! Прокачайте свой мозг правильно До конца акции вы можете воспользоваться специ
⚡️ Последний шанс забрать курсы со СКИДКОЙ 40%! Прокачайте свой мозг правильно До конца акции вы можете воспользоваться специальными ценами на самые востребованные IT-направления. Круто и выгодно прокачать свои скиллы, чтобы получить оффер, уехать на Бали и больше не быть онлайн 😎 ➡️ Разработка AI-агентов — от 49 000 ₽ (вместо 69 000 ₽) Курс про контролируемую разработку ИИ-агентов: качество, стоимость, наблюдаемость и тестирование. С первого занятия — только практическая работа. ➡️ Курс AgentOps — 129 000 ₽ (вместо 149 000 ₽) Профессиональный трек для разработчиков и LLM инженеров о том, как правильно внедрять AI-логику в бэкенд и сохранять железную стабильность сервиса. ➡️ Математика для Data Science — от 29 990 ₽ (вместо 39 990 ₽) Вы научитесь решать сложные математические задачи, которые дают на собеседованиях на позицию дата-сайентиста в бигтехе. Отличная база для мощного старта в DS. ➡️ Курс Специалист по ИИ — 89 000 ₽ (вместо 113 900 ₽) Комплексная программа для получения профессии в сфере ИИ с нуля. За 8 месяцев вы соберете сильное портфолио из 5 реальных проектов и дипломной работы. ➡️ Архитектуры и шаблоны проектирования — 27 990 ₽ (вместо 37 900 ₽) Интенсив для разработчиков, который поможет освоить основные паттерны проектирования и прокачать навыки архитектора программного обеспечения. 🌸 Выбирайте направление, оставляйте заявку на сайте распродажи, и наш менеджер подробно вас проконсультирует
1 258
8
⚡️ Серверная реактивность: Livewire и три его собрата Идея одна: рендерить HTML на сервере и гнать обновления клиенту, убрав фронтенд-фреймворк из уравнения. Реализаций четыре, и разница между ними архитектурная: 🔹 Фреймворк Phoenix LiveView (Elixir) Держит состояние в BEAM-процессе на WebSocket, вычисляя диффы на уровне выражений в шаблоне. 🔹 Инструмент Rails Hotwire Работает без состояния, перегоняя готовые куски HTML через обычный HTTP, что грубо, но покрывает 80% задач. 🔹 Пакет Laravel Livewire Выступает ближайшим клоном LiveView на PHP, где состояние сериализуется в JSON и путешествует туда-обратно при каждом запросе (хотя с Laravel Reverb доступен WebSocket). 🔹 Экспериментальные проекты Go Live и HLive Используют горутины на WebSocket, имеют минимальную экосистему и годятся лишь для внутренних дашбордов. Выбор тут не про «что быстрее», а про экосистему и команду. Для Laravel-стека Livewire — единственный вариант, не требующий смены языка. 🔗 Читать оригинал Библиотека пхпшника
1 265
9
🦾🧠🏋️ Качаем мозги к лету! Все готовятся к пляжному сезону, а мы предлагаем прокачать хард-скилы, чтобы забрать крутой оффе
🦾🧠🏋️ Качаем мозги к лету! Все готовятся к пляжному сезону, а мы предлагаем прокачать хард-скилы, чтобы забрать крутой оффер, строить продукты будущего и работать из любой точки мира 😎 ⚡️ Распродажа @proglib_academy: забирайте самые актуальные образовательные треки по сниженным ценам! ➡️ Разработка AI-агентов — от 49 000 ₽ (вместо 69 000 ₽). ➡️ Курс AgentOps — 129 000 ₽ (вместо 149 000 ₽). ➡️ Математика для разработки AI-моделей — 23 990 ₽ (вместо 31 990 ₽). ➡️ ML для старта в Data Science — 28 990 ₽ (вместо 38 990 ₽). Почему мы? ⭐️Учим для продакшена. Наши программы заточены под реальные задачи бизнеса: как не слить бюджет на токены, как заставить LLM работать стабильно в бэкенде и как выстроить отказоустойчивую архитектуру. ⭐️Спикеры — суровые практики. Вы будете перенимать опыт у действующих AI-архитекторов, тимлидов и ML-инженеров из топовых IT-компаний. ⭐️Комплексный подход. Мы даем как мощный математический фундамент для понимания моделей «под капотом», так и передовые инструменты оркестрации агентов. ⭐️Много практики и фидбека. Вебинары, десятки практических заданий и живое общение с экспертами в чате Telegram на протяжении всего обучения. ⏳ Оставляйте заявку и бронируйте место со СКИДКОЙ 40%
1 206
10
💥 vibe coding — это не продуктивность, а технический долг с красивым названием Я сам использую несколько ИИ-агентов, расчехл
💥 vibe coding — это не продуктивность, а технический долг с красивым названием Я сам использую несколько ИИ-агентов, расчехлять каменный топор не предлагаю. Но смотрю, во что превращается «просто опиши интент, а код появится». PR на 600 строк, который разраб не может объяснить на ревью. Тесты, которые проверяют, что мок вернул то, что в него замокали. «Починили» баг, а прилетело ещё два, потому что никто не читал, что там нагенерилось. Сгенерить за минуту и разгребать месяц — это не 10x к производительности. AI это джун с бесконечной скоростью и нулевым контекстом бизнеса. Джуну ревьюишь каждую строку, а с ИИ часто выключают голову, потому что «модель же умная». Vibe coding — это новый уровень абстракции или мы растим поколение, которое не умеет даже дебажить? 💬 Го в комменты 🐸 Библиотека пхпшника
1 238
11
❓ Расскажите о паттерне Memento Memento — это поведенческий паттерн, который позволяет сохранять и восстанавливать прежнее состояние объекта, не нарушая инкапсуляцию. Простыми словами: Ctrl+Z в любом редакторе — где-то хранится снимок предыдущего состояния, к которому можно откатиться. ▪️ Когда использовать — Нужна функция отмены/отката (undo) — Нужно сохранять контрольные точки состояния — Прямой доступ к полям объекта нарушил бы инкапсуляцию ▪️ Memento vs Command — Command: хранит действие и умеет его отменить — Memento: хранит полный снимок состояния ▪️ Минус Может потреблять много памяти, если состояние объекта большое и снимки создаются часто.
1 119
12
🔍 Профилирование MongoDB-запросов в Laravel Медленный роут часто связан не с самим PHP. Обычно виноваты неоптимальные запросы, отсутствующий индекс или дорогая агрегация. Без видимости на уровне драйвера ловить такое — гадание на кофейной гуще. В гайде собирают лёгкий монитор для связки Laravel + MongoDB из трех частей: — middleware замеряет общую длительность HTTP-запроса; — класс, реализующий CommandSubscriber из MongoDB PHP driver, ловит события commandStarted / commandSucceeded / commandFailed и считает длительность каждой команды; — метрики собираются в QueryMonitorService и в конце реквеста сбрасываются в коллекцию performance_logs. Ключевое → подписка регистрируется один раз в boot() провайдера: use function MongoDB\Driver\Monitoring\addSubscriber; public function boot(): void { addSubscriber(new MongoCommandSubscriber()); } Дальше драйвер сам отдаёт операцию (find, aggregate, insert), коллекцию и тайминг, без правок прикладного кода. Запросы дольше порога помечаются is_slow. Чтобы коллекция логов не разрасталась до неприличия, навешивают TTL-индекс на created_at с expireAfterSeconds: 604800 (неделя). Mongo сам подметает старьё. 🔗 Подробнее Библиотека пхпшника #how_to
1 389
13
#dev_meme
#dev_meme
1 539
14
👀 Практический курс «Разработка AI-агентов для автоматизации задач, работы и собственных проектов» со скидкой 40% до конца м
👀 Практический курс «Разработка AI-агентов для автоматизации задач, работы и собственных проектов» со скидкой 40% до конца мая! Мы поговорили с десятками разработчиков, учли главные боли индустрии и запускаем полностью обновленный курс «ИИ-агенты 5.0». 🎉 Что вы узнаете? - Как радикально оптимизировать траты на токены. - Как на практике оценивать качество и точность работы агента. - Как «докручивать» RAG-системы без потери качества. - Как обеспечить устойчивость агента к сбоям внешних сервисов без падения всей системы, и про многое-многое другое. Спикеры — практики с опытом в AI и Data Science в крупных IT-компаниях, таких как Яндекс, Сбер, Raft и Газпромбанк др. Длительность: 6–12 недель в зависимости от тарифа. 👉 Занимайте место на главном агентском интенсиве по лучшей цене
1 590
15
🐧 База Linux, которую стыдно гуглить Для эффективной работы с серверами нужно уверенно владеть терминалом. Забирайте шпаргал
🐧 База Linux, которую стыдно гуглить Для эффективной работы с серверами нужно уверенно владеть терминалом. Забирайте шпаргалку. Что тут у нас по классике: Файлы и навигация: ls, cd, mkdir, rm, mv, cp. База, без которой ты даже логи не найдешь. Поиск и чтение: find, grep, cat. Твои лучшие друзья при дебаге гигабайтных логов в поисках одной упавшей транзакции. Управление процессами: ps, kill, top. Экстренный набор хирурга, когда какой-то процесс потёк по памяти и положил всю ноду. Права и сеть: chmod, ping, ifconfig. А как у вас отношения с консолью? ❤️ — Живу в терминале 🔥 — Знаю базу 🔹 Курс «Основы IT для непрограммистов» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🏃‍♀️ Азбука айтишника #ликбез
1 364
16
⚡️ Знакомьтесь с экспертом Proglib Academy: AI-архитектор Антон Будняк Антон — мастер превращения сырых AI-идей в отказоустой
⚡️ Знакомьтесь с экспертом Proglib Academy: AI-архитектор Антон Будняк Антон — мастер превращения сырых AI-идей в отказоустойчивые системы. Он знает, как запустить MVP за неделю и масштабировать его так, чтобы архитектура не рассыпалась под нагрузкой в сотни тысяч юзеров. За что его ценит IT-комьюнити: 🟣 Опыт в финтехе и крупном бизнесе Руководил разработкой ML-моделей в финтехе с экономическим эффектом более 100 млн ₽ 🟣 Запуск продуктов на 6.000+ пользователей Антон строит сервисы, которыми пользуются тысячи людей в реальном проде. 🟣 Ускоряет разработку Оптимизировал ML-пайплайны и кратно сократил время от начала разработки до релиза 📚 Где Антон черпает знания (рекомендации эксперта): - X (Twitter) — главный источник новостей. Рекомендую блог Бориса Черни (создателя Claude Code) — там база про использование ИИ в разработке. - Нетворкинг в ТГ: чаты LLM под капотом и AI-чат — здесь можно найти ответ почти на любой технический вопрос. - Новости AI: каналы Сиолошная и Denis Sexy IT. На курсе Agentops Антон учит строить «неубиваемый» бэкенд: работать с очередями, таймаутами и балансировкой нагрузки, чтобы ваши агенты работали стабильно 24/7. 🎁 Майские СКИДКИ в Proglib Academy! До конца мая на все курсы академии (включая AgentOps и разработку ИИ-агентов) действует скидка -40%. Это лучший момент, чтобы войти в AI-разработку под присмотром практиков. Узнать больше о программе и обучении у Антона: 👉 Курс о том, как внедрять AI-логику в бэкенд и сохранять стабильность сервиса Продолжаем знакомить вас с командой? 👍 — Да, ждем новых лиц 🔥 — Пойду подпишусь на каналы из списка Антона 🏃‍♀️ Proglib Academy
1 422
17
⚡️ Как настроить OPcache Preloading в PHP 8.3 и не положить прод Прелоадинг компилирует классы один раз при старте FPM и держит их в shared memory. Минус ~30% к latency на каждый реквест. Разберём, как настроить его правильно. 1️⃣ Включаем в php.ini opcache.enable=1 opcache.preload=/var/www/app/preload.php opcache.preload_user=www-data opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.validate_timestamps=0 validate_timestamps=0 → на проде файлы не меняются между деплоями. Не тратим syscall на stat() каждого файла. Сброс кэша через рестарт FPM (Deployer сделает сам). 2️⃣ Пишем preload.php правильно // ❌ так делать нельзя $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('/var/www/app/vendor') ); foreach ($files as $file) { if ($file->getExtension() === 'php') { opcache_compile_file($file->getRealPath()); } } Проблема: интерфейсы, трейты, абстрактные классы → порядок загрузки важен, одна битая зависимость = FPM не стартует. // ✅ через Composer class map + мягкий fallback // preload.php require __DIR__ . '/vendor/autoload.php'; $classMap = require __DIR__ . '/vendor/composer/autoload_classmap.php'; $ignore = [ '/Tests/', '/test/', '/fixtures/', '/stub/', '/migrations/', '/seeders/', '/factories/', ]; foreach ($classMap as $class => $file) { foreach ($ignore as $pattern) { if (str_contains($file, $pattern)) continue 2; } try { if (!class_exists($class, false) && !interface_exists($class, false) && !trait_exists($class, false) && !enum_exists($class, false) ) { require_once $file; } } catch (\Throwable) { // класс не загрузился — пропускаем, не роняем FPM } } class_exists($class, false) → false отключает автолоад. Проверяем, не загружен ли класс уже по цепочке зависимостей. 3️⃣ Для Laravel берём готовое composer require laragear/preload php artisan preload:generate Пакет анализирует opcache_get_status() на работающем приложении и генерирует preload-список из реально используемых классов, не из всего vendor. // config/preload.php return [ 'condition' => true, 'memory_limit' => 64, // MB под прелоад 'include' => [], 'exclude' => [ 'Illuminate\Support\Facades\*', ], 'overwrite' => true, ]; Фасады исключаем, они резолвятся лениво через контейнер, прелоад им мешает. 4️⃣ Проверяем, что всё работает // диагностика из CLI не работает, только через FPM // создаём роут или скрипт $status = opcache_get_status(); $preload = $status['preload_statistics'] ?? []; echo "Preloaded classes: " . count($preload['classes'] ?? []) . PHP_EOL; echo "Preloaded funcs: " . count($preload['functions'] ?? []) . PHP_EOL; echo "Memory used: " . round($preload['memory_consumption'] / 1024 / 1024, 2) . " MB" . PHP_EOL; Важно: php -r "opcache_get_status();" в CLI покажет пустоту. Прелоад живёт только в памяти FPM-мастера. 5️⃣ Интегрируем в деплой // deploy.php (Deployer) task('php-fpm:reload', function () { run('sudo systemctl reload php8.3-fpm'); }); after('deploy:symlink', 'php-fpm:reload'); reload, не restart. Reload делает graceful: мастер-процесс перечитывает конфиг и прелоад, старые воркеры дорабатывают текущие реквесты. Zero downtime. 6️⃣ Подводные камни — Память: прелоад жрёт shared memory. 2000 классов ≈ 30–50 MB. Если memory_consumption мал, часть классов молча не загрузится — Наследование: если прелоадите дочерний класс, родитель должен быть загружен раньше. Composer classmap решает это, ручной glob — нет — Enum + PHP 8.1+: backed enum'ы с интерфейсами иногда падают при прелоаде. Если ловите segfault при старте FPM — исключайте enum'ы и обновляйтесь — Xdebug: прелоад несовместим с xdebug. На dev-окружении выключайте opcache.preload 📌 Итог Preloading — бесплатный буст перформанса без изменения кода. Но только если прелоадите то, что реально используется, обрабатываете ошибки загрузки и не забываете reload FPM при деплое. В связке с Deployer это одна строка в пайплайне. Библиотека пхпшника
1 369
18
📌 Итог Preloading — бесплатный буст перформанса без изменения кода. Но только если прелоадите то, что реально используется, обрабатываете ошибки загрузки и не забываете reload FPM при деплое. В связке с Deployer это одна строка в пайплайне. Библиотека пхпшника (https://t.me/phpproglib) Библиотека пхпшника
1
19
⚡️ Как настроить OPcache Preloading в PHP 8.3 и не положить прод Прелоадинг компилирует классы один раз при старте FPM и держит их в shared memory. Минус ~30% к latency на каждый реквест. Но 90% настраивают его неправильно. 1️⃣ Включаем в php.ini ini opcache.enable=1 opcache.preload=/var/www/app/preload.php opcache.preload_user=www-data opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.validate_timestamps=0 validate_timestamps=0 — на проде файлы не меняются между деплоями. Не тратим syscall на stat() каждого файла. Сброс кэша — через рестарт FPM (Deployer сделает сам). 2️⃣ Пишем preload.php правильно Наивный подход — загрузить всё подряд. Получите fatal при старте FPM. php // ❌ так делать нельзя $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('/var/www/app/vendor') ); foreach ($files as $file) { if ($file->getExtension() === 'php') { opcache_compile_file($file->getRealPath()); } } Проблема: интерфейсы, трейты, абстрактные классы — порядок загрузки важен. Одна битая зависимость = FPM не стартует. php // ✅ через Composer class map + мягкий fallback // preload.php require __DIR__ . '/vendor/autoload.php'; $classMap = require __DIR__ . '/vendor/composer/autoload_classmap.php'; $ignore = [ '/Tests/', '/test/', '/fixtures/', '/stub/', '/migrations/', '/seeders/', '/factories/', ]; foreach ($classMap as $class => $file) { foreach ($ignore as $pattern) { if (str_contains($file, $pattern)) continue 2; } try { if (!class_exists($class, false) && !interface_exists($class, false) && !trait_exists($class, false) && !enum_exists($class, false) ) { require_once $file; } } catch (\Throwable) { // класс не загрузился — пропускаем, не роняем FPM } } class_exists($class, false) — false отключает автолоад. Проверяем, не загружен ли класс уже по цепочке зависимостей. 3️⃣ Для Laravel — берём готовое bash composer require laragear/preload php artisan preload:generate Пакет анализирует opcache_get_status() на работающем приложении и генерирует preload-список из реально используемых классов. Не из всего vendor. php // config/preload.php return [ 'condition' => true, 'memory_limit' => 64, // MB под прелоад 'include' => [], 'exclude' => [ 'Illuminate\Support\Facades\*', ], 'overwrite' => true, ]; Фасады исключаем — они резолвятся лениво через контейнер, прелоад им мешает. 4️⃣ Проверяем, что всё работает php // диагностика из CLI не работает, только через FPM // создаём роут или скрипт $status = opcache_get_status(); $preload = $status['preload_statistics'] ?? []; echo "Preloaded classes: " . count($preload['classes'] ?? []) . PHP_EOL; echo "Preloaded funcs: " . count($preload['functions'] ?? []) . PHP_EOL; echo "Memory used: " . round($preload['memory_consumption'] / 1024 / 1024, 2) . " MB" . PHP_EOL; Важно: php -r "opcache_get_status();" в CLI покажет пустоту. Прелоад живёт только в памяти FPM-мастера. 5️⃣ Интегрируем в деплой php // deploy.php (Deployer) task('php-fpm:reload', function () { run('sudo systemctl reload php8.3-fpm'); }); after('deploy:symlink', 'php-fpm:reload'); reload, не restart. Reload делает graceful: мастер-процесс перечитывает конфиг и прелоад, старые воркеры дорабатывают текущие реквесты. Zero downtime. 6️⃣ Подводные камни — Память: прелоад жрёт shared memory. 2000 классов ≈ 30–50 MB. Если memory_consumption мал — часть классов молча не загрузится — Наследование: если прелоадите дочерний класс, родитель должен быть загружен раньше. Composer classmap решает это, ручной glob — нет — Enum + PHP 8.1+: backed enum'ы с интерфейсами иногда падают при прелоаде. Если ловите segfault при старте FPM — исключайте enum'ы и обновляйтесь — Xdebug: прелоад несовместим с xdebug. На dev-окружении выключайте opcache.preload
1
20
🛠 Реактивный SPA на Symfony без единой строчки React Согласись, что неприятен JS-налог: дублирование роутинга, валидации и моделей на фронте, возня с Vite и раздутые бандлы. Hotwire переворачивает схему — сервер шлёт готовые куски HTML, Turbo подменяет DOM, страница не перезагружается. 🚀 Стек первой части туториала: — фреймворк Symfony 7.4 + AssetMapper (без Webpack и Node); — компоненты Turbo Drive/Frames/Streams для бесшовных обновлений; — библиотека Stimulus там, где реально нужен JS (drag & drop); — протокол Mercure через SSE вместо возни с WebSockets на PHP; — стили Tailwind через symfonycasts-бандл (снова без npm); Крутой приём → колонки доски генерятся из PHP Enum: enum TaskStatus: string { case TODO = 'todo'; case IN_PROGRESS = 'in_progress'; case DONE = 'done'; } #[ORM\Column(length: 50, enumType: TaskStatus::class)] private TaskStatus $status = TaskStatus::TODO; Достаточно передать TaskStatus::cases() в Twig и новый статус добавится одной строкой в Enum. Никакой правки шаблонов и магических строк (Doctrine сам сериализует значения в varchar). Во второй части туториала будет немного нативного HTML5 DnD и Turbo Streams через Mercure для синхронизации между вкладками. 🔗 Подробнее Библиотека пхпшника
1 597