🧹 Git-команда, которая спасёт ваш репозиторий от мусора
Проблема: вы удалили ветки, сделали git reset, отменили мёржи, но репозиторий почему-то весит всё больше. git clone на новом месте занимает вечность. Куда уходит место?
Дело в том, что Git — барахольщик. Он хранит все объекты: старые блобы, недостижимые коммиты, забытые stash'ы. Даже то, что вам давно не нужно.
💡 Решение: git gc и его старший брат git gc --aggressive
Рассмотрим все все возможности git gc.
1️⃣ Сколько мусора накопилось
Обратите внимание на size-pack — это реальный вес вашего репо.
2️⃣ Самые тяжёлые объекты в истории
Часто находятся артефакты сборки, дампы БД или случайно закоммиченные .jar на 200 МБ 😬
3️⃣ Запустите агрессивную сборку мусора
--aggressive заставляет Git перепаковать объекты с нуля, а --prune=now удаляет недостижимые объекты немедленно, не дожидаясь дефолтных двух недель.
4️⃣ Сравните результат
На живых проектах с историей в 2+ года разница бывает в разы.
⚠️ --prune=now безвозвратно удалит объекты, на которые нет ссылок. Если вы планировали восстановить что-то через git reflog — сделайте это до запуска.
Проблема: вы удалили ветки, сделали git reset, отменили мёржи, но репозиторий почему-то весит всё больше. git clone на новом месте занимает вечность. Куда уходит место?
Дело в том, что Git — барахольщик. Он хранит все объекты: старые блобы, недостижимые коммиты, забытые stash'ы. Даже то, что вам давно не нужно.
Рассмотрим все все возможности git gc.
git count-objects -vH
Обратите внимание на size-pack — это реальный вес вашего репо.
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '/^blob/ {print $3, $4}' \
| sort -rn \
| head -10
Часто находятся артефакты сборки, дампы БД или случайно закоммиченные .jar на 200 МБ 😬
git gc --aggressive --prune=now
--aggressive заставляет Git перепаковать объекты с нуля, а --prune=now удаляет недостижимые объекты немедленно, не дожидаясь дефолтных двух недель.
git count-objects -vH
На живых проектах с историей в 2+ года разница бывает в разы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥1
Куда на самом деле уходят токены во время агентного кодинга? ⚡️
Forwarded from Proglib.academy | IT-курсы
В итоге станет понятнее, сколько ресурсов выделять на запуск, когда его останавливать и в какой момент лучше изменить подход🔍
До 31 июля курс можно купить со скидкой, а все материалы останутся в бессрочном доступе.
Please open Telegram to view this post
VIEW IN TELEGRAM
В PHP 8.4 появилась долгожданная возможность — хуки свойств.
Это встроенная логика чтения и записи значения прямо в объявлении свойства. Без отдельных методов, без шаблонных getSomething() и setSomething(). Код становится компактнее, выразительнее и проще для сопровождения.
🔹 В чём была проблема
До этого было всего два варианта:
— классический подход с приватными полями и методами доступа;
— promoted-properties из конструктора — удобно, но без логики.
У обоих подходов есть ряд минусов:
— негде аккуратно разместить валидацию;
— сложно добавить логирование изменений;
— неудобно реализовать ленивые вычисления;
— класс быстро разрастался вспомогательными методами.
🔹 Что изменилось с хуками
Теперь PHP позволяет перехватывать:
→ момент чтения свойства;
→ момент записи значения.
При этом снаружи используется привычный доступ к свойству, внутри — чётко определённое место для логики и в одном классе можно сочетать обычные свойства и свойства с хуками.
🔹 Виртуальные свойства
PHP 8.4 позволяет создавать свойства без собственного хранилища.
Такие свойства:
→ не занимают память;
→ вычисляются при каждом обращении;
→ выступают как интерфейс к другим данным объекта.
Полезно для: объединённых представлений данных, вычисляемых значений, и упрощения публичного API модели.
— хуки несовместимы с readonly-свойствами;
— изменение по ссылке может обойти логику записи;
— не все внутренние функции PHP вызывают хуки одинаково.
🔗 Хабр
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1🔥1😁1
Команда (Node.js + Terser для JS):
npx terser src/app.js -o dist/app.min.js -c -m
Команда (Node.js + CleanCSS для CSS):
npx clean-css-cli -o dist/style.min.css src/style.css
🔹 Ускорение загрузки страниц: Меньший размер JS и CSS сокращает время передачи данных.
🔹 Оптимизация производительности: Минифицированный код обрабатывается браузером быстрее.
🔹 Чистый продакшн: Убираются ненужные пробелы и комментарии, что делает код компактным.
-c или --compress: Сжимает код, удаляя лишние конструкции.
-m или --mangle: Переименовывает переменные и функции, уменьшая размер.
--source-map: Генерирует source map для удобного дебага минифицированного кода.
Пример с source map:
npx terser src/app.js -o dist/app.min.js -c -m --source-map
--compatibility — задаёт совместимость с браузерами.
--level — уровень оптимизации (1 или 2).
Пример:
npx clean-css-cli -o dist/style.min.css src/style.css --level 2
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚3❤2🔥2🥱2
PHP 8.6 вышла на финишную прямую 🚀
Июль оказался насыщенным для PHP 8.6: команда выпустила сразу три тестовые версии — Alpha 1, Alpha 2 и Alpha 3. Следующий этап — Beta 1, которая запланирована на 13 августа.
После перехода к бета-версии список новых возможностей, как правило, уже сформирован. Дальше основное внимание уделяется исправлению ошибок, совместимости и подготовке к стабильному релизу.
💡 Если вы поддерживаете библиотеку, фреймворк или крупное приложение, сейчас хорошее время добавить PHP 8.6 в CI отдельной задачей и прогнать тесты. Найти несовместимость за несколько месяцев до релиза намного проще, чем после выхода стабильной версии.
Библиотека пхпшника
Июль оказался насыщенным для PHP 8.6: команда выпустила сразу три тестовые версии — Alpha 1, Alpha 2 и Alpha 3. Следующий этап — Beta 1, которая запланирована на 13 августа.
После перехода к бета-версии список новых возможностей, как правило, уже сформирован. Дальше основное внимание уделяется исправлению ошибок, совместимости и подготовке к стабильному релизу.
Финальный релиз PHP 8.6 ожидается 19 ноября 2026 года.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🌚4🤔3
Не все знают, что начиная с PHP 8.0 дочерний метод может объявлять меньше именованных параметров, чем родительский. Это возможно, если несколько совместимых параметров заменяются одним variadic-параметром.
class X
{
public function foo(int $a, string $c, string ...$b): void {}
}
class Y extends X
{
public function foo(int $a, string ...$b): void {}
}
Такой код полностью корректен. Значение, которое в родительском методе попадало в $c, в дочернем станет первым элементом $b.
$x->foo(1, 'A');
$x->foo(1, 'A', 'B', 'C');
А вот так уже нельзя:
class Y extends X
{
public function foo(int $a, int ...$b): void {}
}
или
class Y extends X
{
public function foo(int $a, string $c, string $d, string ...$b): void {}
}
В первом случае меняется тип параметров, во втором — дочерний метод начинает требовать больше обязательных аргументов. Оба варианта нарушают совместимость сигнатур.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4🌚3👍2
PHP-Cheat-Sheet.pdf
283.3 KB
Некоторые примеры относятся к версиям PHP до 8+, но в целом материал остаётся полезным.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱6👍2🌚1
Одна из самых ожидаемых возможностей PHP 8.5 — pipe-оператор (|>). Он передаёт результат выражения слева первым аргументом вызываемой функции справа, позволяя строить цепочки преобразований, которые читаются сверху вниз.
// Было
$result = strlen(htmlspecialchars(trim($input)));
// Стало
$result = $input
|> trim(...)
|> htmlspecialchars(...)
|> strlen(…);
Запись ... — это first-class callable. Такой код проще читать, отлаживать и постепенно расширять: каждый этап преобразования явно отделён от предыдущего.
Pipe-оператор особенно полезен там, где данные проходят через несколько последовательных функций — меньше вложенности, больше читаемости.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7😁7🌚4😢2
Совет по Laravel💡 : Встроенная валидация
Хотя Laravel предлагает множество правил валидации, иногда возникает необходимость в использовании пользовательских правил.
Обычно они записываются в пользовательском классе.
Но знаете ли вы, что можно выполнять и валидацию в строке? 🚀
Библиотека пхпшника
Хотя Laravel предлагает множество правил валидации, иногда возникает необходимость в использовании пользовательских правил.
Обычно они записываются в пользовательском классе.
Но знаете ли вы, что можно выполнять и валидацию в строке? 🚀
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱6👍5🌚4
Кажется, у онлайн-обучения появился формат, которого давно не хватало 👇
Forwarded from Proglib.academy | IT-курсы
Логично, что обучение тоже постепенно приходит к той же модели: не покупать отдельный курс под каждую новую тему, а иметь доступ ко всей библиотеке и выбирать, что актуально именно сейчас.
Такой формат недавно появился и в Proglib Academy. Вместо одного курса — доступ сразу ко всей библиотеке и новым материалам, которые появляются в подписке
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁19🥰2
Если нужно заменить сразу несколько строк, многие используют str_replace(). Но есть нюанс: замены выполняются последовательно, поэтому результат одной замены может попасть под следующую.
$map = [
'foo' => 'bar',
'foobar' => 'foo',
];
$input = 'foobar and foo';
echo str_replace(
array_keys($map),
array_values($map),
$input
);
// bar bar and bar
Сначала "foo" превращается в "bar", поэтому "foobar" становится "barbar" и до второй замены уже не доходит.
echo strtr($input, $map);
// foo and bar
Функция выполняет один проход по строке и всегда выбирает самое длинное совпадение. Уже заменённые части строки повторно не обрабатываются.
Благодаря этому:
— не нужно сортировать шаблоны по длине;
— замены не влияют друг на друга;
— результат получается более предсказуемым.
Если требуется заменить несколько независимых подстрок по словарю вида "что" => "на что", strtr() часто оказывается более удачным выбором.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5🔥4🥱1
Директива
@env_required() позволяет проверять, что переменная среды установлена и имеет значение, отличное от null. Она может быть полезна для обеспечения того, чтобы приложение работало правильно только при наличии определенных переменных среды.В нашем примере директива
@env_required() используется для проверки переменной среды APP_KEY. Если переменная не установлена, будет выброшено исключение.Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱6👍5😁4
Как работает очередь задач на примере создания миниатюр для видео.
Цель: после загрузки видео оно должно высветиться в виде миниатюры
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Если вы переходите с PHP-FPM на RoadRunner, Laravel Queue или Symfony Messenger — вы увидите один и тот же эффект:
Память растёт ступеньками и никогда не падает.
40 → 200 → 350 МБ… и так до перезапуска.
Unset, GC, collect_cycles() — не помогают.
Это не утечка. Это архитектура PHP.
PHP использует Zend Memory Manager: он выделяет память крупными чанками (2–4 МБ) и не отдаёт их ОС назад, даже если внутри всё освобождено.
Каждый пик — новый baseline. Обработали 100k записей → память выросла → процесс будет держать этот объём до конца жизни.
ORM ->all() или ->get() на десятки тысяч записей
большой файл в file_get_contents()
накопление массивов
сложные eager-loading графы ORM
— Стриминг вместо коллекций:
User::lazy()->each(fn($u) => processUser($u));
или:
Record::chunk(100, function ($rows) {
foreach ($rows as $r) processRecord($r);
});
✔️ Doctrine:
foreach ($q->toIterable() as $u) {
process($u);
$em->detach($u);
}
— Изоляция тяжёлых операций в функцию — память освобождается при выходе из scope.
— Ротация воркеров — обязательна:
Laravel:
php artisan queue:work --max-jobs=1000
RoadRunner:
pool:
max_jobs: 1000
Messenger:
messenger:consume --limit=1000
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😁3🤔3👍2❤1