Сегодня хочу поделиться темой, которая регулярно спасает мне часы (а иногда и дни) работы — как быстро находить и устранять узкие места в производительности PHP-приложения.
Когда проект начинает подтормаживать, первая реакция — «ну, наверное, сервер слабый». А на деле 80% проблем можно найти прямо в коде. Вот мой рабочий чеклист:
1. Включаю профилировщик.
Если проект на Laravel —
2. Смотрю SQL-запросы.
Удивительно, сколько «тормозов» сидит именно в базе. Часто помогает банальное добавление индексов или переписывание одного запроса.
3. Ищу повторяющиеся операции.
Иногда вижу: одна и та же функция дергается в цикле по 1000 раз, хотя результат можно закешировать.
4. Анализирую работу с файлами.
Если есть много
5. Включаю кэширование.
Даже простой
Мой совет: не пытайтесь «оптимизировать на глаз». Всегда начинайте с измерений — профилировщик покажет правду.
А вы как ищете и устраняете узкие места? Какие инструменты используете чаще всего?
👉 @php_lib
Когда проект начинает подтормаживать, первая реакция — «ну, наверное, сервер слабый». А на деле 80% проблем можно найти прямо в коде. Вот мой рабочий чеклист:
1. Включаю профилировщик.
Если проект на Laravel —
laravel-debugbar
или Clockwork
. Для чистого PHP — Xdebug или Tideways. Они показывают, какие функции и запросы жрут время.2. Смотрю SQL-запросы.
Удивительно, сколько «тормозов» сидит именно в базе. Часто помогает банальное добавление индексов или переписывание одного запроса.
3. Ищу повторяющиеся операции.
Иногда вижу: одна и та же функция дергается в цикле по 1000 раз, хотя результат можно закешировать.
4. Анализирую работу с файлами.
Если есть много
file_get_contents()
или операций с большими файлами — выношу их в фоновые задачи (очереди).5. Включаю кэширование.
Даже простой
OPcache
и Redis
для хранения промежуточных данных творят чудеса.Мой совет: не пытайтесь «оптимизировать на глаз». Всегда начинайте с измерений — профилировщик покажет правду.
А вы как ищете и устраняете узкие места? Какие инструменты используете чаще всего?
👉 @php_lib
👍15
Сегодня хочу поговорить о ситуации, с которой сталкивался, думаю, каждый PHP-разработчик — "магическое" исчезновение переменных.
Да, вот эти моменты, когда ты уверен, что
Причина часто банальна — область видимости.
Многие забывают, что переменные в PHP живут в контексте, где они созданы. Например, внутри функции нельзя просто так достучаться до переменной, объявленной снаружи — она там не существует.
Пример:
Чтобы это работало, у нас есть три пути:
1. Передать параметром:
2. Использовать
3. Замыкание с
💡 Совет: всегда старайтесь передавать данные явно - это делает код чище и облегчает тестирование.
А вы как решаете проблему передачи переменных между функциями и методами? Используете глобальные, DI или что-то ещё?
👉 @php_lib
Да, вот эти моменты, когда ты уверен, что
$userData
тут точно есть… а в реальности — Undefined variable: userData
.Причина часто банальна — область видимости.
Многие забывают, что переменные в PHP живут в контексте, где они созданы. Например, внутри функции нельзя просто так достучаться до переменной, объявленной снаружи — она там не существует.
Пример:
$userName = 'Иван';
function greet() {
echo "Привет, $userName"; // Ошибка!
}
greet();
Чтобы это работало, у нас есть три пути:
1. Передать параметром:
function greet($name) {
echo "Привет, $name";
}
greet($userName);
2. Использовать
global
(но я не советую — код становится менее предсказуемым):
global $userName;
3. Замыкание с
use
:
$userName = 'Иван';
$greet = function() use ($userName) {
echo "Привет, $userName";
};
$greet();
💡 Совет: всегда старайтесь передавать данные явно - это делает код чище и облегчает тестирование.
А вы как решаете проблему передачи переменных между функциями и методами? Используете глобальные, DI или что-то ещё?
👉 @php_lib
🤡7👍6
Нужно ли в PHP перед вызовом функций ставить обратный слэш?
Несколько лет назад я прочитал статью «How to dump and inspect PHP OPCodes» в которой наконец увидел, что опкоды в PHP действительно существуют. И кроме того, мы, разработчики, которые пишем на PHP на эти опкоды можем влиять, тем самым оптимизируя производительность нашего кода. В статье так же рассказывалось о том, как применение бэкслэшей может ускорить выполнение программ. Я был под впечатлением...
Опкодами (см. Код операции) называется некий промежуточный код, который всё ещё понятен человеку и который выполняется некой исполняющей средой. В случае PHP этой средой является Zend Virtual Machine (она же Zend Engine).
https://habr.com/ru/articles/934316/
👉 @php_lib
Несколько лет назад я прочитал статью «How to dump and inspect PHP OPCodes» в которой наконец увидел, что опкоды в PHP действительно существуют. И кроме того, мы, разработчики, которые пишем на PHP на эти опкоды можем влиять, тем самым оптимизируя производительность нашего кода. В статье так же рассказывалось о том, как применение бэкслэшей может ускорить выполнение программ. Я был под впечатлением...
Опкодами (см. Код операции) называется некий промежуточный код, который всё ещё понятен человеку и который выполняется некой исполняющей средой. В случае PHP этой средой является Zend Virtual Machine (она же Zend Engine).
https://habr.com/ru/articles/934316/
👉 @php_lib
👍7🔥2
🔧 Сложности с масштабированием консьюмеров в RabbitMQ? Узнайте, как избежать ошибок, которые могут привести к потерям в порядке обработки сообщений.
📅 На открытом уроке 21 августа в 20:00 МСК разберём реальные кейсы и покажем, как правильно масштабировать консьюмеры, сохраняя порядок обработки. Узнаете, какие проблемы могут возникнуть при некорректном масштабировании и как их решить.
🎯 Получите ценные знания по прогнозированию и устранению проблем, повысите производительность системы и избегайте критических ошибок.
🚀 Посетите вебинар и получите скидку на полный курс «Symfony Framework»! Регистрация открыта: https://vk.cc/cOwLiZ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📅 На открытом уроке 21 августа в 20:00 МСК разберём реальные кейсы и покажем, как правильно масштабировать консьюмеры, сохраняя порядок обработки. Узнаете, какие проблемы могут возникнуть при некорректном масштабировании и как их решить.
🎯 Получите ценные знания по прогнозированию и устранению проблем, повысите производительность системы и избегайте критических ошибок.
🚀 Посетите вебинар и получите скидку на полный курс «Symfony Framework»! Регистрация открыта: https://vk.cc/cOwLiZ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
💡 Совет по Laravel
Не позволяй запросам к базе данных замедлять работу. Используй фасад Cache в Laravel для временного кэширования данных и сокращения количества обращений к базе.
👉 @php_lib
Не позволяй запросам к базе данных замедлять работу. Используй фасад Cache в Laravel для временного кэширования данных и сокращения количества обращений к базе.
👉 @php_lib
👍10
Сегодня хочу поделиться одной небольшой, но очень полезной привычкой, которая здорово экономит время в работе с PHP-проектами.
Когда я только начинал, я постоянно забывал про php artisan tinker (если речь про Laravel) или встроенный интерактивный шелл
Например, нужно быстро понять, как работает кастомный accessor в модели? Вместо того чтобы городить временные роуты или var_dump-ить в контроллере - открываешь tinker:
И сразу работаешь с моделью:
Буквально за пару секунд получаешь ответ, без лишнего мусора в коде.
Еще круто использовать tinker для тестирования сервисов или вызова хелперов. Иногда я даже проверяю SQL-запросы через Eloquent, чтобы потом использовать их в сидерах или тестах.
Короче, мой совет: если еще не используете — приучите себя чаще заходить в tinker. Это ваш "быстрый песочница", которая всегда под рукой.
А вы как чаще отлаживаете код в Laravel - через tinker, dd() или дебаггер в IDE? Напишите в комментах, будет интересно сравнить!
👉 @php_lib
Когда я только начинал, я постоянно забывал про 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? Напишите в комментах, будет интересно сравнить!
👉 @php_lib
👍10❤1👎1🤔1
🚀 Почему стоит выбрать Symfony для разработки?
🔹 Модульность и компоненты — независимые части, которые можно использовать отдельно, ускоряя развитие и повышая гибкость.
🔹 Гибкая настройка — высокий уровень кастомизации, поддержка Dependency Injection для сложных проектов.
🔹 Надежность и поддержка — LTS-версии до 3 лет, стабильность и регулярные обновления для бизнеса.
🔹 Инструменты разработки — Symfony CLI, профайлер, генераторы кода, автоконфигурация — ускоряют работу и отладку.
🔹 Сообщество и документация — большое сообщество, обучающие материалы, рецепты и мероприятия помогают быстро освоить и решать задачи.
🧩 Где используют? — Spotify, BlaBlaCar, Dailymotion, а также компоненты Symfony используют Laravel и другие фреймворки.
Выбирайте Symfony — создавайте масштабируемые, гибкие и надежные проекты!
Пройдите тест, получите скидку на курс «Symfony Framework» и станьте востребованным PHP-разработчиком с передовыми навыками: https://vk.cc/cOTLs6
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔹 Модульность и компоненты — независимые части, которые можно использовать отдельно, ускоряя развитие и повышая гибкость.
🔹 Гибкая настройка — высокий уровень кастомизации, поддержка Dependency Injection для сложных проектов.
🔹 Надежность и поддержка — LTS-версии до 3 лет, стабильность и регулярные обновления для бизнеса.
🔹 Инструменты разработки — Symfony CLI, профайлер, генераторы кода, автоконфигурация — ускоряют работу и отладку.
🔹 Сообщество и документация — большое сообщество, обучающие материалы, рецепты и мероприятия помогают быстро освоить и решать задачи.
🧩 Где используют? — Spotify, BlaBlaCar, Dailymotion, а также компоненты Symfony используют Laravel и другие фреймворки.
Выбирайте Symfony — создавайте масштабируемые, гибкие и надежные проекты!
Пройдите тест, получите скидку на курс «Symfony Framework» и станьте востребованным PHP-разработчиком с передовыми навыками: https://vk.cc/cOTLs6
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Gemini API PHP Client
Клиент Google Gemini API для PHP позволяет вам использовать модель искусственного интеллекта Gemini.
Установка
Базовая генерация текста
https://github.com/gemini-api-php/client
👉 @php_lib
Клиент 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
👉 @php_lib
👍8
Каким мог бы быть Laravel WebServer, если бы он работал через очередь?
Привет! Сегодня я хочу поделиться с вами одной интересной идеей — а что если Laravel WebServer принимал бы все HTTP-запросы не напрямую, а через обычную очередь задач Laravel Queue? Вместо привычных PHP-FPM, Swoole, RoadRunner или FrankenPHP — весь запрос обрабатывался бы как задача в очереди.
Звучит странно? Давайте разбираться, как это могло бы работать и что из этого получилось бы.
https://laravel.su/p/kakim-mog-by-byt-laravel-webserver-esli-by-on-rabotal-cerez-ocered
👉 @php_lib
Привет! Сегодня я хочу поделиться с вами одной интересной идеей — а что если Laravel WebServer принимал бы все HTTP-запросы не напрямую, а через обычную очередь задач Laravel Queue? Вместо привычных PHP-FPM, Swoole, RoadRunner или FrankenPHP — весь запрос обрабатывался бы как задача в очереди.
Звучит странно? Давайте разбираться, как это могло бы работать и что из этого получилось бы.
https://laravel.su/p/kakim-mog-by-byt-laravel-webserver-esli-by-on-rabotal-cerez-ocered
👉 @php_lib
👍6👎1
💡 Совет по Laravel
Нужно проверить, что в вашем вводе существуют определённые ключи массива?
Используйте required_array_keys, чтобы убедиться, что в данных массива присутствуют конкретные ключи - идеально подходит для API-эндпоинтов, которые ожидают строгую структуру данных.
Ссылка на документацию: https://laravel.com/docs/12.x/validation#rule-required-array-keys
👉 @php_lib
Нужно проверить, что в вашем вводе существуют определённые ключи массива?
Используйте required_array_keys, чтобы убедиться, что в данных массива присутствуют конкретные ключи - идеально подходит для API-эндпоинтов, которые ожидают строгую структуру данных.
Ссылка на документацию: https://laravel.com/docs/12.x/validation#rule-required-array-keys
👉 @php_lib
👍5
Сегодня хочу поговорить про одну проблему, с которой я сталкивался сам и вижу её у других PHP-разработчиков - “магия” в коде.
Что я имею в виду? Это когда ты открываешь проект, а там сервисы создаются «сами собой», данные в объект попадают неизвестно откуда, а половина зависимостей подтягивается где-то «под капотом».
Вроде удобно - меньше кода писать. Но вот через пару месяцев ты сам же сидишь и думаешь: «А откуда вообще берётся этот объект? И почему тут такая зависимость?»
🔹 Основная проблема магии - она убивает явность кода. Чем больше скрытых механизмов, тем сложнее поддерживать проект и подключать новых разработчиков.
Примеры из практики:
- Использование глобальных хелперов вместо DI.
- Автоматический вызов методов через __call или __get.
- Массовая магия в Laravel (facades, hidden bindings и т.д.).
🛠 Что можно сделать:
1. Минимизировать скрытые механизмы - лучше написать чуть больше явного кода.
2. Использовать контейнер зависимостей, но регистрировать их явно.
3. Документировать «точки входа» и договориться в команде, где магия допустима, а где нет.
Когда код становится предсказуемым, ты меньше тратишь времени на дебаг, быстрее понимаешь чужие изменения и увереннее двигаешься вперёд.
А как у вас в проектах? Вы за явный код или любите, когда всё работает «само»?
👉 @php_lib
Что я имею в виду? Это когда ты открываешь проект, а там сервисы создаются «сами собой», данные в объект попадают неизвестно откуда, а половина зависимостей подтягивается где-то «под капотом».
Вроде удобно - меньше кода писать. Но вот через пару месяцев ты сам же сидишь и думаешь: «А откуда вообще берётся этот объект? И почему тут такая зависимость?»
🔹 Основная проблема магии - она убивает явность кода. Чем больше скрытых механизмов, тем сложнее поддерживать проект и подключать новых разработчиков.
Примеры из практики:
- Использование глобальных хелперов вместо DI.
- Автоматический вызов методов через __call или __get.
- Массовая магия в Laravel (facades, hidden bindings и т.д.).
🛠 Что можно сделать:
1. Минимизировать скрытые механизмы - лучше написать чуть больше явного кода.
2. Использовать контейнер зависимостей, но регистрировать их явно.
3. Документировать «точки входа» и договориться в команде, где магия допустима, а где нет.
Когда код становится предсказуемым, ты меньше тратишь времени на дебаг, быстрее понимаешь чужие изменения и увереннее двигаешься вперёд.
А как у вас в проектах? Вы за явный код или любите, когда всё работает «само»?
👉 @php_lib
👍9
💡Знал ли вы, что…
Метод Number::abbreviate в Laravel преобразует сложные числа в удобочитаемый формат:
👉 @php_lib
Метод Number::abbreviate в Laravel преобразует сложные числа в удобочитаемый формат:
👉 @php_lib
👍10❤1
💡Совет по Laravel
Определение языка пользователя
Laravel использует компонент HttpFoundation из Symfony, который предоставляет полезные возможности. Если вы работаете с локализацией и нужно определить предпочитаемый язык пользователя, просто вызовите метод getPreferredLanguage 🚀
👉 @php_lib
Определение языка пользователя
Laravel использует компонент HttpFoundation из Symfony, который предоставляет полезные возможности. Если вы работаете с локализацией и нужно определить предпочитаемый язык пользователя, просто вызовите метод getPreferredLanguage 🚀
👉 @php_lib
👍5
🚫 Хватит бороться с монолитом!
Узнайте, как создавать масштабируемые и гибкие приложения на PHP и Symfony.
🎯 На открытом уроке разберем современную event-driven архитектуру:
— Symfony Messenger: обработка событий синхронно и асинхронно.
— CQRS: разделение команд и запросов для производительности.
— Event Sourcing: как хранить историю всех изменений состояния.
✅ Поймем, в каких проектах эти подходы действительно необходимы, и посмотрим на живой код.
💡 Вебинар будет полезен:
— PHP и Symfony-разработчикам, растущим до уровня мидл+ и сеньоров.
— Тимлидам и архитекторам, планирующим устойчивые к нагрузкам системы.
— Начинающим специалистам, чтобы увидеть перспективы развития.
📅 Регистрируйтесь на бесплатный вебинар «Event-driven архитектура в PHP и Symfony» 1 октября в 20:00!:
https://vk.cc/cPQvA3
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Узнайте, как создавать масштабируемые и гибкие приложения на PHP и Symfony.
🎯 На открытом уроке разберем современную event-driven архитектуру:
— Symfony Messenger: обработка событий синхронно и асинхронно.
— CQRS: разделение команд и запросов для производительности.
— Event Sourcing: как хранить историю всех изменений состояния.
✅ Поймем, в каких проектах эти подходы действительно необходимы, и посмотрим на живой код.
💡 Вебинар будет полезен:
— PHP и Symfony-разработчикам, растущим до уровня мидл+ и сеньоров.
— Тимлидам и архитекторам, планирующим устойчивые к нагрузкам системы.
— Начинающим специалистам, чтобы увидеть перспективы развития.
📅 Регистрируйтесь на бесплатный вебинар «Event-driven архитектура в PHP и Symfony» 1 октября в 20:00!:
https://vk.cc/cPQvA3
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🚀 Если производительность является приоритетом в вашем проекте, возможно, стоит полностью отключить lazy loading.
Eloquent выбросит огромное исключение, если вы попытаетесь обратиться к связи, которая не была загружена заранее (eager-loaded).
👉 @php_lib
Eloquent выбросит огромное исключение, если вы попытаетесь обратиться к связи, которая не была загружена заранее (eager-loaded).
👉 @php_lib
👍2😁1
🔥 PHP-разработчики, готовы прокачать Laravel до уровня, на который другие тратят годы?
Онлайн курс «Framework Laravel» - ваш шанс за 3 месяца освоить фреймворк, который делает разработку проще, быстрее и интереснее.
Какие преимущества обучения по Laravel:
• Laravel ускоряет разработку за счет элегантного синтаксиса, богатой экосистемы и инструментов Artisan.
• Интуитивный ORM Eloquent упрощает работу с данными и повышает читаемость кода.
• Фреймворк масштабируется от MVP до высоконагруженных систем, имеет встроенные средства оптимизации, легко интегрируется с Vue/React/Angular, поддерживается активным сообществом и подтвержден практикой крупных компаний.
Также приглашаем вас на бесплатный вебинар «Advanced Eloquent Relations в Laravel»
🗓 7 октября, 20:00
На вебинаре:
• Кастомные отношения в Laravel Eloquent — от Post до Comment и Author
• Использование отношений за пределами реляционных БД
• Практика на реальных примерах
Кто придёт первым - освоит секреты продвинутого Laravel и научится создавать отношения там, где другие даже не думают их строить.
Записаться на вебинар: https://vk.cc/cQ0xUP
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Онлайн курс «Framework Laravel» - ваш шанс за 3 месяца освоить фреймворк, который делает разработку проще, быстрее и интереснее.
Какие преимущества обучения по Laravel:
• Laravel ускоряет разработку за счет элегантного синтаксиса, богатой экосистемы и инструментов Artisan.
• Интуитивный ORM Eloquent упрощает работу с данными и повышает читаемость кода.
• Фреймворк масштабируется от MVP до высоконагруженных систем, имеет встроенные средства оптимизации, легко интегрируется с Vue/React/Angular, поддерживается активным сообществом и подтвержден практикой крупных компаний.
Также приглашаем вас на бесплатный вебинар «Advanced Eloquent Relations в Laravel»
🗓 7 октября, 20:00
На вебинаре:
• Кастомные отношения в Laravel Eloquent — от Post до Comment и Author
• Использование отношений за пределами реляционных БД
• Практика на реальных примерах
Кто придёт первым - освоит секреты продвинутого Laravel и научится создавать отношения там, где другие даже не думают их строить.
Записаться на вебинар: https://vk.cc/cQ0xUP
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Совет по Laravel💡
Знаете ли вы .... tap() = Tweak and Return 🪄
Да, в Laravel метод tap() позволяет изменить объект и вернуть его обратно — идеально для чистого и читаемого кода.
👉 @php_lib
Знаете ли вы .... tap() = Tweak and Return 🪄
Да, в Laravel метод tap() позволяет изменить объект и вернуть его обратно — идеально для чистого и читаемого кода.
👉 @php_lib
👍6