es
Feedback
Библиотека PHP программиста 👨🏼‍💻👩‍💻

Библиотека PHP программиста 👨🏼‍💻👩‍💻

Ir al canal en Telegram

Полезные материалы по PHP, Laravel, Symfony, CodeIgniter, CakePHP, Phalcon По всем вопросам @evgenycarter

Mostrar más
2 062
Suscriptores
Sin datos24 horas
-27 días
-730 días
Archivo de publicaciones
Сегодня хочу поговорить про одну проблему, с которой я сталкивался сам и вижу её у других PHP-разработчиков - “магия” в коде.
Сегодня хочу поговорить про одну проблему, с которой я сталкивался сам и вижу её у других PHP-разработчиков - “магия” в коде. Что я имею в виду? Это когда ты открываешь проект, а там сервисы создаются «сами собой», данные в объект попадают неизвестно откуда, а половина зависимостей подтягивается где-то «под капотом». Вроде удобно - меньше кода писать. Но вот через пару месяцев ты сам же сидишь и думаешь: «А откуда вообще берётся этот объект? И почему тут такая зависимость?» 🔹 Основная проблема магии - она убивает явность кода. Чем больше скрытых механизмов, тем сложнее поддерживать проект и подключать новых разработчиков. Примеры из практики: - Использование глобальных хелперов вместо DI. - Автоматический вызов методов через __call или __get. - Массовая магия в Laravel (facades, hidden bindings и т.д.). 🛠 Что можно сделать: 1. Минимизировать скрытые механизмы - лучше написать чуть больше явного кода. 2. Использовать контейнер зависимостей, но регистрировать их явно. 3. Документировать «точки входа» и договориться в команде, где магия допустима, а где нет. Когда код становится предсказуемым, ты меньше тратишь времени на дебаг, быстрее понимаешь чужие изменения и увереннее двигаешься вперёд. А как у вас в проектах? Вы за явный код или любите, когда всё работает «само»? 📲 Мы в MAX 👉 @php_lib

Gemini API PHP Client Клиент Google Gemini API для PHP позволяет вам использовать модель искусственного интеллекта Gemini. Ус
Gemini API PHP Client Клиент Google Gemini API для PHP позволяет вам использовать модель искусственного интеллекта Gemini. Установка composer require gemini-api-php/client Базовая генерация текста

use GeminiAPI\Client;
use GeminiAPI\Resources\Parts\TextPart;

$client = new Client('GEMINI_API_KEY');
$response = $client->geminiPro()->generateContent(
    new TextPart('PHP in less than 100 chars'),
);

print $response->text();
// PHP: A server-side scripting language used to create dynamic web applications.
// Easy to learn, widely used, and open-source.
https://github.com/gemini-api-php/client 📲 Мы в MAX 👉 @php_lib

🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Городские📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП https://max.ru/channel_krasnodar_novosty Краснодар Новости https://max.ru/channel_novosibirsk_novosti Новосибирск https://max.ru/channel_samara_novosti Новости Самары https://max.ru/channel_ekaterinburg_novosti Новости Екатеринбурга https://max.ru/channel_kazan_novosti Новости Казани https://max.ru/channel_omsk_novosti Новости Омска https://max.ru/channel_moskva_24 Москва 24

Сегодня хочу поделиться одной небольшой, но очень полезной привычкой, которая здорово экономит время в работе с PHP-проектами
Сегодня хочу поделиться одной небольшой, но очень полезной привычкой, которая здорово экономит время в работе с PHP-проектами. Когда я только начинал, я постоянно забывал про php artisan tinker (если речь про Laravel) или встроенный интерактивный шелл php -a. А ведь это супер-удобный способ быстро проверить кусок кода, протестировать работу функции или глянуть, что вернет тот или иной запрос. Например, нужно быстро понять, как работает кастомный accessor в модели? Вместо того чтобы городить временные роуты или var_dump-ить в контроллере - открываешь tinker:

php artisan tinker
И сразу работаешь с моделью:

$user = App\Models\User::find(1);
$user->profile->full_name;
Буквально за пару секунд получаешь ответ, без лишнего мусора в коде. Еще круто использовать tinker для тестирования сервисов или вызова хелперов. Иногда я даже проверяю SQL-запросы через Eloquent, чтобы потом использовать их в сидерах или тестах. Короче, мой совет: если еще не используете — приучите себя чаще заходить в tinker. Это ваш "быстрый песочница", которая всегда под рукой. А вы как чаще отлаживаете код в Laravel - через tinker, dd() или дебаггер в IDE? Напишите в комментах, будет интересно сравнить! 📲 Мы в MAX 👉 @php_lib

💡 Совет по Laravel Не позволяй запросам к базе данных замедлять работу. Используй фасад Cache в Laravel для временного кэшир
💡 Совет по Laravel Не позволяй запросам к базе данных замедлять работу. Используй фасад Cache в Laravel для временного кэширования данных и сокращения количества обращений к базе. 📲 Мы в MAX 👉 @php_lib

Нужно ли в PHP перед вызовом функций ставить обратный слэш? Несколько лет назад я прочитал статью «How to dump and inspect PH
Нужно ли в PHP перед вызовом функций ставить обратный слэш? Несколько лет назад я прочитал статью «How to dump and inspect PHP OPCodes» в которой наконец увидел, что опкоды в PHP действительно существуют. И кроме того, мы, разработчики, которые пишем на PHP на эти опкоды можем влиять, тем самым оптимизируя производительность нашего кода. В статье так же рассказывалось о том, как применение бэкслэшей может ускорить выполнение программ. Я был под впечатлением... Опкодами (см. Код операции) называется некий промежуточный код, который всё ещё понятен человеку и который выполняется некой исполняющей средой. В случае PHP этой средой является Zend Virtual Machine (она же Zend Engine). https://habr.com/ru/articles/934316/ 📲 Мы в MAX 👉 @php_lib

Сегодня хочу поделиться темой, которая регулярно спасает мне часы (а иногда и дни) работы — как быстро находить и устранять у
Сегодня хочу поделиться темой, которая регулярно спасает мне часы (а иногда и дни) работы — как быстро находить и устранять узкие места в производительности PHP-приложения. Когда проект начинает подтормаживать, первая реакция — «ну, наверное, сервер слабый». А на деле 80% проблем можно найти прямо в коде. Вот мой рабочий чеклист: 1. Включаю профилировщик. Если проект на Laravel — laravel-debugbar или Clockwork. Для чистого PHP — Xdebug или Tideways. Они показывают, какие функции и запросы жрут время. 2. Смотрю SQL-запросы. Удивительно, сколько «тормозов» сидит именно в базе. Часто помогает банальное добавление индексов или переписывание одного запроса. 3. Ищу повторяющиеся операции. Иногда вижу: одна и та же функция дергается в цикле по 1000 раз, хотя результат можно закешировать. 4. Анализирую работу с файлами. Если есть много file_get_contents() или операций с большими файлами — выношу их в фоновые задачи (очереди). 5. Включаю кэширование. Даже простой OPcache и Redis для хранения промежуточных данных творят чудеса. Мой совет: не пытайтесь «оптимизировать на глаз». Всегда начинайте с измерений — профилировщик покажет правду. А вы как ищете и устраняете узкие места? Какие инструменты используете чаще всего? 📲 Мы в MAX 👉 @php_lib

🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП

Сегодня хочу поделиться полезной практикой, которая реально экономит время при работе с чужим кодом — быстрая навигация и понимание проекта через composer.json. Когда попадаешь в новый проект, чаще всего первым делом начинаешь блуждать по папкам, читать контроллеры, роуты, сервисы… Но есть более быстрый способ понять архитектуру - сразу открыть composer.json. Что можно сразу понять: - Какие библиотеки используются - а значит, какие фреймворки, ORM, инструменты кеширования или логирования ждут нас внутри. - Какая версия PHP нужна — помогает избежать сюрпризов с несовместимыми функциями. - Автозагрузка - раздел autoload и autoload-dev сразу подскажет, где искать код и как он структурирован. Например, если вижу App\\ => src/, я знаю, что основной код живёт в src. - Скрипты - в scripts иногда прячутся удобные команды для деплоя, генерации, тестов, которые можно запускать через composer run-script. Я часто делаю так: открываю composer.json, сразу строю для себя “карту” проекта и понимаю, где искать бизнес-логику и какие инструменты уже встроены. А вы как знакомитесь с новым проектом? С чего начинаете? 📲 Мы в MAX 👉 @php_lib

🔥 Полезная фича в Laravel: скрываем данные с помощью Str::mask() Метод Str::mask() позволяет легко замаскировать часть строки определенным символом (например, *). 💡 Небольшой совет: Начиная с версии Laravel 8.69, этот метод встроен "из коробки" и отлично подходит для безопасного отображения email-адресов, номеров телефонов или токенов. Как это выглядит на практике:

$userEmail = 'username@domain.com';

$maskedEmail = Str::mask($userEmail, '*', 4);
// Результат: user***************

// Если передать отрицательное число в качестве третьего аргумента, 
// маскировка начнется с конца строки:

$maskedEmail = Str::mask($userEmail, '*', -16, 6);
// Результат: use******domain.com

#laravel #php #webdev #советы_разработчикам 📲 Мы в MAX 👉 @php_lib

💡Совет по Laravel: Проверка дат с помощью Carbon Уверен, тебе хоть раз приходилось проверять, истекла ли дата или находится
💡Совет по Laravel: Проверка дат с помощью Carbon Уверен, тебе хоть раз приходилось проверять, истекла ли дата или находится в будущем. Так как Laravel под капотом использует Carbon, у тебя есть доступ к множеству удобных методов, которые позволяют делать это элегантно 🚀 📲 Мы в MAX 👉 @php_lib

Как правильно работать с большими массивами данных в PHP, чтобы не убить память и сервер. Когда мы пишем скрипты, которые обр
Как правильно работать с большими массивами данных в PHP, чтобы не убить память и сервер. Когда мы пишем скрипты, которые обрабатывают тысячи (или миллионы) строк — будь то импорт из CSV, выгрузка из БД или массовая обработка, — часто допускается ошибка: всё грузится в память сразу. В итоге сервер умирает от нехватки памяти, а скрипт - от таймаута. Что делать? 1. Частями, а не всё сразу Например, если вы работаете с PDO:

   $stmt = $pdo->query("SELECT * FROM big_table");
   while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
       process($row); // Обрабатываем каждую строку на лету
   }
   
Так данные не будут храниться в огромном массиве — обработка идёт построчно. 2. Используйте генераторы Генераторы (yield) позволяют работать с большими данными лениво:

   function getRows($pdo) {
       $stmt = $pdo->query("SELECT * FROM big_table");
       while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
           yield $row;
       }
   }

   foreach (getRows($pdo) as $row) {
       process($row);
   }
   
Память почти не растёт — магия генераторов. 3. Разбивайте на батчи Иногда эффективнее брать кусками:

   $limit = 1000;
   for ($offset = 0; ; $offset += $limit) {
       $rows = $pdo->query("SELECT * FROM big_table LIMIT $limit OFFSET $offset")->fetchAll();
       if (!$rows) break;
       foreach ($rows as $row) {
           process($row);
       }
   }
   
4. Не забывайте про стриминг файлов Если это CSV или JSON — читайте построчно через fgets() или stream_get_line(), а не file_get_contents(). Такие подходы сильно упрощают жизнь и экономят ресурсы. А вы как работаете с большими данными? Используете генераторы или предпочитаете батчи? 📲 Мы в MAX 👉 @php_lib

Совет по PHP/Laravel 🚀 Когда у вас есть два случая для кастомных исключений, относящихся к одному и тому же домену, вместо с
Совет по PHP/Laravel 🚀 Когда у вас есть два случая для кастомных исключений, относящихся к одному и тому же домену, вместо создания нескольких классов исключений можно использовать один класс с разными методами! Так код будет чище и лучше структурирован! 💪🔥 📲 Мы в MAX 👉 @php_lib

💡 Совет для Laravel‑разработчиков Используйте Crypt facade — он уже есть в Laravel: - Работает на вашем APP_KEY - Шифрует да
💡 Совет для Laravel‑разработчиков Используйте Crypt facade — он уже есть в Laravel: - Работает на вашем APP_KEY - Шифрует данные через AES‑256‑CBC - Защищает от подделки (MAC) 🔐 Храните API‑токены, пароли и секреты безопасно — прямо из коробки. 📲 Мы в MAX 👉 @php_lib

Простой, но полезный приём для дебага в Laravel — логирование SQL-запросов в человекочитаемом виде. По умолчанию DB::listen()
Простой, но полезный приём для дебага в Laravel — логирование SQL-запросов в человекочитаемом виде. По умолчанию DB::listen() в Laravel выводит запрос с плейсхолдерами ?, а значения параметров идут отдельно. Это не всегда удобно — сложно быстро понять, что реально выполняется. Вот сниппет, который собирает полный SQL-запрос с подставленными значениями:

DB::listen(function ($query) {
    $sql = $query->sql;
    foreach ($query->bindings as $binding) {
        $binding = is_numeric($binding) ? $binding : "'{$binding}'";
        $sql = preg_replace('/\?/', $binding, $sql, 1);
    }
    logger()->info("Executed query: {$sql}");
});
📌 Пример:

select * from users where email = 'john@example.com' and age > 18
Очень удобно, когда ты хочешь понять, почему условие WHERE не сработало или почему запрос медленный. Можно кинуть это в AppServiceProvider::boot(), и на локальной машине всегда видеть, что реально уходит в базу. 📲 Мы в MAX 👉 @php_lib

🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП

💡Совет по Laravel Знаешь ли ты… о методе skip в планировщике Laravel? С помощью skip() можно указать, когда команда не должн
💡Совет по Laravel Знаешь ли ты… о методе skip в планировщике Laravel? С помощью skip() можно указать, когда команда не должна выполняться. 📲 Мы в MAX 👉 @php_lib

Laravel lazy() против get() Знаешь ли ты… что можно обрабатывать большие объёмы данных из базы с помощью lazy() — это гораздо
Laravel lazy() против get() Знаешь ли ты… что можно обрабатывать большие объёмы данных из базы с помощью lazy() — это гораздо эффективнее по памяти, чем get(). 📲 Мы в MAX 👉 @php_lib

Сегодня я покажу вам, как быстро разрулить хаос в проекте с кастомным фреймворком, где нет нормального логирования. Ситуация:
Сегодня я покажу вам, как быстро разрулить хаос в проекте с кастомным фреймворком, где нет нормального логирования. Ситуация: клиент дал старый проект, ошибок — куча, но логов нет вообще. В коде try-catch, а в catch — пусто. Что делать? Вот мой быстрый чеклист, который спасал не раз: 1. Глобальный обработчик ошибок и исключений

set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    error_log("[PHP ERROR] $errstr in $errfile:$errline");
    return false;
});

set_exception_handler(function (Throwable $e) {
    error_log("[UNCAUGHT EXCEPTION] " . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine());
});
Добавил в index.php, и уже вижу, что именно валится. 2. Простой логгер на каждый чих Создал файл logger.php:

function log_debug($msg) {
    file_put_contents(__DIR__.'/debug.log', date('[Y-m-d H:i:s] ') . $msg . PHP_EOL, FILE_APPEND);
}
В нужных местах пишу log_debug('что-то случилось');. Дёшево и сердито, зато работает. 3. Прокинул заголовки и запросы В самых первых строках запроса:

log_debug("REQUEST: " . $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI']);
log_debug("HEADERS: " . json_encode(getallheaders()));
log_debug("POST: " . json_encode($_POST));
Теперь видно, с чем именно клиент ломает мой старый код. Не всегда есть время подтягивать Monolog и делать всё красиво. Иногда нужно быстро найти, где горит — и потушить. А уже потом наводить красоту. А вы как действуете в таких ситуациях? Есть свои приёмы? 📲 Мы в MAX 👉 @php_lib