Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
Все самое полезное для пхпшника в одном канале. По рекламе: @proglib_adv Учиться у нас: clc.to/M561SQ Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Больше📈 Аналитический обзор Telegram-канала Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
Канал Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter (@phpproglib) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 10 524 подписчиков, занимая 11 391 место в категории Технологии и приложения и 60 853 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 10 524 подписчиков.
Согласно последним данным от 25 августа, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -62, а за последние 24 часа — 1, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 19.18%. В первые 24 часа после публикации контент обычно набирает 9.49% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 2 019 просмотров. В течение первых суток публикация набирает 999 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 16.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как php, laravel, пхпшника, artisan, api.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Все самое полезное для пхпшника в одном канале.
По рекламе: @proglib_adv
Учиться у нас: clc.to/M561SQ
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b”
Благодаря высокой частоте обновлений (последние данные получены 26 августа, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
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 применит изменения.
Библиотека пхпшника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Файлы и навигация: ls, cd, mkdir, rm, mv, cp. База, без которой ты даже логи не найдешь. Поиск и чтение: find, grep, cat. Твои лучшие друзья при дебаге гигабайтных логов в поисках одной упавшей транзакции. Управление процессами: ps, kill, top. Экстренный набор хирурга, когда какой-то процесс потёк по памяти и положил всю ноду. Права и сеть: chmod, ping, ifconfig.А как у вас отношения с консолью? ❤️ — Живу в терминале 🔥 — Знаю базу 🔹 Курс «Основы IT для непрограммистов» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🏃♀️ Азбука айтишника #ликбез
Руководил разработкой 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
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=0validate_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 это одна строка в пайплайне.
Библиотека пхпшника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.preloadenum 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 для синхронизации между вкладками.
🔗 Подробнее
Библиотека пхпшника