5 способов оптимизации производительности приложений Symfony
Symfony-приложения часто сталкиваются с медленной загрузкой и высокой нагрузкой на сервер. Основные причины — неэффективные запросы к базе данных, недостатки кэширования и не оптимизированные настройки. Вот как это исправить:
Оптимизация запросов к базе данных
Медленные запросы замедляют отклик приложения и создают нагрузку на сервер. Чтобы этого избежать:
🔸Запрашивайте только необходимые данные, а не всю таблицу.
🔸Добавляйте индексы на часто используемые поля.
🔸Используйте более быстрые типы соединений между таблицами, если связь данных гарантирована.
🔸Избегайте лишних запросов при работе с коллекциями данных. Это достигается загрузкой данных заранее.
🔸Обрабатывайте данные партиями, чтобы избежать перегрузки памяти.
Эти меры значительно ускоряют взаимодействие приложения с базой данных.
Кэширование для ускорения работы
Кэширование снижает нагрузку на сервер и ускоряет отклик приложения.
🔸Полное кэширование страниц позволяет сохранять их как статические файлы, чтобы серверу не приходилось каждый раз генерировать одно и то же содержимое.
🔸Кэширование часто используемых данных или запросов уменьшает обращения к базе данных.
🔸Выбор подходящего инструмента для кэширования зависит от потребностей приложения. Например, для локальных серверов подходит APCu, для распределенных систем — Redis.
Кроме того, при обновлении приложения не забывайте очищать и обновлять кэш, чтобы избежать конфликтов и устаревших данных.
Оптимизация настроек Symfony для production
Некоторые изменения в конфигурации позволяют заметно повысить производительность:
🔸В режиме production отключите отладку и сократите количество логов, чтобы снизить нагрузку на процессор.
🔸Включите PHP-кэширование (OPcache), чтобы ускорить выполнение скриптов за счет их предварительной компиляции.
🔸Настройте загрузчик классов, чтобы ускорить процесс запуска приложения.
Эти меры помогают снизить затраты на системные ресурсы и ускоряют загрузку страниц.
Анализ и исправление узких мест
Профилирование помогает выявить скрытые проблемы производительности.
🔸Используйте инструменты мониторинга для анализа ключевых метрик, таких как время отклика, использование памяти, количество запросов к базе данных и эффективность кэширования.
🔸Обратите внимание на самые популярные страницы и функции приложения, чтобы улучшить их в первую очередь.
Применяя эти данные, можно устранить «узкие места», которые тормозят работу приложения.
Управление статическими ресурсами
Эффективная работа с файлами CSS, JavaScript и изображениями значительно ускоряет загрузку страниц.
🔸Уменьшайте размер файлов через минификацию, чтобы ускорить их загрузку.
🔸Объединяйте файлы, чтобы сократить количество запросов к серверу.
🔸Используйте «ленивую загрузку» для изображений и других ресурсов, которые не нужны сразу.
🔸Для хранения и доставки ресурсов применяйте CDN, чтобы снизить нагрузку на сервер.
Эти меры заметно улучшают пользовательский опыт.
Symfony-приложения часто сталкиваются с медленной загрузкой и высокой нагрузкой на сервер. Основные причины — неэффективные запросы к базе данных, недостатки кэширования и не оптимизированные настройки. Вот как это исправить:
Оптимизация запросов к базе данных
Медленные запросы замедляют отклик приложения и создают нагрузку на сервер. Чтобы этого избежать:
🔸Запрашивайте только необходимые данные, а не всю таблицу.
🔸Добавляйте индексы на часто используемые поля.
🔸Используйте более быстрые типы соединений между таблицами, если связь данных гарантирована.
🔸Избегайте лишних запросов при работе с коллекциями данных. Это достигается загрузкой данных заранее.
🔸Обрабатывайте данные партиями, чтобы избежать перегрузки памяти.
Эти меры значительно ускоряют взаимодействие приложения с базой данных.
Кэширование для ускорения работы
Кэширование снижает нагрузку на сервер и ускоряет отклик приложения.
🔸Полное кэширование страниц позволяет сохранять их как статические файлы, чтобы серверу не приходилось каждый раз генерировать одно и то же содержимое.
🔸Кэширование часто используемых данных или запросов уменьшает обращения к базе данных.
🔸Выбор подходящего инструмента для кэширования зависит от потребностей приложения. Например, для локальных серверов подходит APCu, для распределенных систем — Redis.
Кроме того, при обновлении приложения не забывайте очищать и обновлять кэш, чтобы избежать конфликтов и устаревших данных.
Оптимизация настроек Symfony для production
Некоторые изменения в конфигурации позволяют заметно повысить производительность:
🔸В режиме production отключите отладку и сократите количество логов, чтобы снизить нагрузку на процессор.
🔸Включите PHP-кэширование (OPcache), чтобы ускорить выполнение скриптов за счет их предварительной компиляции.
🔸Настройте загрузчик классов, чтобы ускорить процесс запуска приложения.
Эти меры помогают снизить затраты на системные ресурсы и ускоряют загрузку страниц.
Анализ и исправление узких мест
Профилирование помогает выявить скрытые проблемы производительности.
🔸Используйте инструменты мониторинга для анализа ключевых метрик, таких как время отклика, использование памяти, количество запросов к базе данных и эффективность кэширования.
🔸Обратите внимание на самые популярные страницы и функции приложения, чтобы улучшить их в первую очередь.
Применяя эти данные, можно устранить «узкие места», которые тормозят работу приложения.
Управление статическими ресурсами
Эффективная работа с файлами CSS, JavaScript и изображениями значительно ускоряет загрузку страниц.
🔸Уменьшайте размер файлов через минификацию, чтобы ускорить их загрузку.
🔸Объединяйте файлы, чтобы сократить количество запросов к серверу.
🔸Используйте «ленивую загрузку» для изображений и других ресурсов, которые не нужны сразу.
🔸Для хранения и доставки ресурсов применяйте CDN, чтобы снизить нагрузку на сервер.
Эти меры заметно улучшают пользовательский опыт.
🥱5👍4
Пример HTTP-сервера на PHP с использованием файберов
PHP часто подвергается критике за отсутствие встроенных возможностей для создания конкурентных приложений. В версии 8.1 был добавлен класс
PHP часто подвергается критике за отсутствие встроенных возможностей для создания конкурентных приложений. В версии 8.1 был добавлен класс
Fiber
, который, согласно RFC, должен упростить создание конкурентных приложений. Однако, материалов, демонстрирующих использование данного функционала для построения приложений практически нет, напротив, говорится, что файберы — это функционал, предназначенный для использования разработчиками фреймворков и приводятся какие-то малоинформативные отрывки кода. В этой статье будет продемонстрирован концептуальный пример конкурентного приложения на PHP с использованием файберов.Хабр
Пример HTTP-сервера на PHP с использованием файберов
Платформа PHP часто подвергается критике за отсутствие встроенных возможностей для создания конкурентных приложений. В версии 8.1 был добавлен класс Fiber , который, согласно RFC , должен упростить...
👍8🔥1
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Защита от CSRF в PHP
Подделка межсайтовых запросов (CSRF) — это уязвимость веб-безопасности, позволяющая злоумышленнику обманом заставить аутентифицированного пользователя выполнить нежелательные действия на сайте, на котором он в данный момент находится под своим логином. Атака осуществляется путем злоупотребления доверием сайта к браузеру пользователя.
Подделка межсайтовых запросов (CSRF) — это уязвимость веб-безопасности, позволяющая злоумышленнику обманом заставить аутентифицированного пользователя выполнить нежелательные действия на сайте, на котором он в данный момент находится под своим логином. Атака осуществляется путем злоупотребления доверием сайта к браузеру пользователя.
DEV Community
CSRF Protection in PHP
What is CSRF? Cross-Site Request Forgery (CSRF) is a web security vulnerability that...
👍2
#хочу_спросить
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
❤1
Большой пополняемый список знаний, в который включены теории, законы, принципы, паттерны разработки и многое другое, что однозначно будет полезно знать каждому разработчику.
GitHub
GitHub - dwmkerr/hacker-laws: 🧠 Laws, Theories, Principles and Patterns for developers and technologists.
🧠 Laws, Theories, Principles and Patterns for developers and technologists. - dwmkerr/hacker-laws
👍3
Как передаются переменные (по значению или по ссылке)?
В PHP переменные могут передаваться как по значению, так и по ссылке.
По умолчанию, в PHP переменные передаются по значению. Это означает, что когда переменная передается в функцию или присваивается другой переменной, создается ее копия, и любые изменения, сделанные внутри функции или на другой переменной, не влияют на оригинальную переменную.
Однако, PHP также предоставляет возможность передавать переменные по ссылке, используя символ '&' перед переменной при ее передаче в функцию или присваивании другой переменной. Когда переменная передается по ссылке, функция или другая переменная работают с тем же экземпляром переменной, и изменения внутри функции или на другой переменной отражаются на оригинальной переменной.
#вопросы_с_собеседований
В PHP переменные могут передаваться как по значению, так и по ссылке.
По умолчанию, в PHP переменные передаются по значению. Это означает, что когда переменная передается в функцию или присваивается другой переменной, создается ее копия, и любые изменения, сделанные внутри функции или на другой переменной, не влияют на оригинальную переменную.
Однако, PHP также предоставляет возможность передавать переменные по ссылке, используя символ '&' перед переменной при ее передаче в функцию или присваивании другой переменной. Когда переменная передается по ссылке, функция или другая переменная работают с тем же экземпляром переменной, и изменения внутри функции или на другой переменной отражаются на оригинальной переменной.
#вопросы_с_собеседований
👍13🥱3
Xdebug, работающий с Docker и PHP 8.4, за одну минуту
Настройка Xdebug может показаться сложной, но на самом деле её можно выполнить быстро, особенно если использовать Docker. В этой статье показано, как за несколько минут настроить Xdebug в проекте на Laravel с использованием PHP 8.4 и Xdebug 3.4.0.
Настройка Xdebug может показаться сложной, но на самом деле её можно выполнить быстро, особенно если использовать Docker. В этой статье показано, как за несколько минут настроить Xdebug в проекте на Laravel с использованием PHP 8.4 и Xdebug 3.4.0.
Laravel News
Get Xdebug Working With Docker and PHP 8.4 in One Minute - Laravel News
Xdebug has a history of being complex to get going, but I am here to show you how to use it in under a minute with Docker in a Laravel project.
👍4❤2
💬 Пишите ли вы тесты на свой код?
❤️ — всегда пишу тесты, которые покрывают важные места
👍 — иногда пишу, зависит от проекта
🥱 — еще не разбирался с тестами
❤️ — всегда пишу тесты, которые покрывают важные места
👍 — иногда пишу, зависит от проекта
🥱 — еще не разбирался с тестами
👍84🥱60❤40🎉3👾2
🙇♂️ Отобрать одного разраба на стек PHP + Vanilla JS после нескольких десятков созвонов-собеседований — вот они, современные реалии.
Почему выпускники курсов присылают резюме пачками, но выхлоп от обучения собственных юристов компании оказывается выше, чем от собеседований по вакансии?
— рассказывает Виталий Квитковский, руководитель отдела разработки и DevOps.
Под катом вас ждет:
☑️ Кратко о структуре собеседования.
☑️ Разбор задач.
☑️ Чего обычно не хватает джунам и как это добрать?
☑️ Что такое базовое программирование?
☑️ Как этому научиться?
👉 Читать
Почему выпускники курсов присылают резюме пачками, но выхлоп от обучения собственных юристов компании оказывается выше, чем от собеседований по вакансии?
— рассказывает Виталий Квитковский, руководитель отдела разработки и DevOps.
Под катом вас ждет:
☑️ Кратко о структуре собеседования.
☑️ Разбор задач.
☑️ Чего обычно не хватает джунам и как это добрать?
☑️ Что такое базовое программирование?
☑️ Как этому научиться?
👉 Читать
👍5😁2
Forwarded from Библиотека программиста | программирование, кодинг, разработка
👑🧟 Король спама: насколько сильно ты бесишь коллег в рабочих чатах
Признайся, ты тоже иногда отправляешь голосовые сообщения из маршрутки? Или может быть, ты тот самый человек, который пишет «Привет» и исчезает на час? Всего 10 вопросов, которые помогут понять, являешься ли ты мастером цифрового этикета или главным спамером офиса. Готов узнать правду?
👉 Пройти тест
Признайся, ты тоже иногда отправляешь голосовые сообщения из маршрутки? Или может быть, ты тот самый человек, который пишет «Привет» и исчезает на час? Всего 10 вопросов, которые помогут понять, являешься ли ты мастером цифрового этикета или главным спамером офиса. Готов узнать правду?
👉 Пройти тест
❤2👍1😁1👾1
Forwarded from Библиотека программиста | программирование, кодинг, разработка
🍎 Подборка лучших статей «Библиотеки программиста» за ноябрь: сохраняй в заметки, чтобы не пропустить #самыйсок
✌️🆚⚛️ Vite vs Create React App: почему разработчики массово переходят на новый инструмент
⚛️ 8 важнейших аспектов JavaScript, которые нужно освоить до изучения React
🔀 Команды git merge и git rebase: преимущества, недостатки и ключевые различия
👾🔍 Укрощение монстров: мониторинг и управление ресурсоемкими запросами в Django + PostgreSQL
🚀 Как ускорить распределенные системы: 8 стратегий снижения времени ожидания
🧪 Успешное тестирование: основы и передовые приемы Jest. Часть 1
👨💻🚀 Тест: насколько ты продвинутый разраб?
✌️🆚⚛️ Vite vs Create React App: почему разработчики массово переходят на новый инструмент
⚛️ 8 важнейших аспектов JavaScript, которые нужно освоить до изучения React
🔀 Команды git merge и git rebase: преимущества, недостатки и ключевые различия
👾🔍 Укрощение монстров: мониторинг и управление ресурсоемкими запросами в Django + PostgreSQL
🚀 Как ускорить распределенные системы: 8 стратегий снижения времени ожидания
🧪 Успешное тестирование: основы и передовые приемы Jest. Часть 1
👨💻🚀 Тест: насколько ты продвинутый разраб?
👍1
Оптимизированная ленивая загрузка в Symfony Doctrine для повышения производительности
Во время работы над проектом Symfony возникла проблема с производительностью из-за неожиданного поведения Doctrine. В одной из сущностей была настроена связь OneToOne с параметром
Проблема
Пример: сущность
Усложнённые запросы: ненужные операции JOIN увеличивали нагрузку на базу данных.
Избыточное использование памяти: данные загружались в память даже при их ненужности.
Замедление работы API: запросы, возвращающие списки магазинов, замедлялись из-за лишних данных.
Решение
1. Перепроектирование связи
Связь была преобразована из OneToOne в ManyToOne. Теперь
2. Обновление схемы базы данных
С помощью Doctrine Migrations была изменена структура базы данных: старый внешний ключ для связи OneToOne был удалён, и добавлен ключ для ManyToOne.
3. Корректировка запросов
Теперь детали магазина загружаются только по необходимости
4. Профилирование
С помощью инструментов Symfony была подтверждена оптимизация. Теперь связанные сущности не загружаются без явного запроса.
Результаты
🟢Скорость выполнения запросов: уменьшилась в среднем на 35%.
🟢Использование памяти: значительно сократилось, так как избыточные данные больше не загружаются.
🟢Время ответа API: улучшилось на 20–30% для запросов с большими объёмами данных.
👉Ссылка на Medium
Во время работы над проектом Symfony возникла проблема с производительностью из-за неожиданного поведения Doctrine. В одной из сущностей была настроена связь OneToOne с параметром
fetch="LAZY»
, чтобы загружать связанные данные только при необходимости. Однако Doctrine загружал связанные сущности заранее, что приводило к избыточной нагрузке.Проблема
Пример: сущность
Store
имела связь OneToOne с сущностью StoreDetail
, содержащей метаданные о магазине. Даже при включённой ленивой загрузке Doctrine автоматически добавлял JOIN, что влияло на производительность:Усложнённые запросы: ненужные операции JOIN увеличивали нагрузку на базу данных.
Избыточное использование памяти: данные загружались в память даже при их ненужности.
Замедление работы API: запросы, возвращающие списки магазинов, замедлялись из-за лишних данных.
Решение
1. Перепроектирование связи
Связь была преобразована из OneToOne в ManyToOne. Теперь
StoreDetail
ссылался на Store
, что позволило Doctrine корректно применять ленивую загрузку.2. Обновление схемы базы данных
С помощью Doctrine Migrations была изменена структура базы данных: старый внешний ключ для связи OneToOne был удалён, и добавлен ключ для ManyToOne.
3. Корректировка запросов
Теперь детали магазина загружаются только по необходимости
4. Профилирование
С помощью инструментов Symfony была подтверждена оптимизация. Теперь связанные сущности не загружаются без явного запроса.
Результаты
🟢Скорость выполнения запросов: уменьшилась в среднем на 35%.
🟢Использование памяти: значительно сократилось, так как избыточные данные больше не загружаются.
🟢Время ответа API: улучшилось на 20–30% для запросов с большими объёмами данных.
👉Ссылка на Medium
🥱10👍3🤔3❤1
❗Вакансии «Библиотеки программиста» — ждем вас в команде!
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
job.proglib.io
Вакансии в медиа «Библиотека программиста»
Количество проектов в редакции постоянно растет, так что нам всегда нужны специалисты
ResultTransformer в Symfony проектах
Symfony со стандартным набором возможностей представляет собой мощное и универсальное решение, способное справляться с широким спектром бизнес-задач. Существует подход, который известен далеко не каждому разработчику на Symfony, а если и известен, то чаще всего поверхностно и редко применяется на практике. Настало время подробнее рассмотреть эту менее известную, но интересную сторону фреймворка.
Один из таких подходов связан с использованием функциональности Doctrine, позволяющей возвращать готовые DTO, что избавляет разработчика от ручной работы по преобразованию данных. Этот процесс, известный как ResultTransformer, автоматизирует преобразование данных в DTO, значительно упрощая задачу программиста.
Однако, стоит учитывать, что этот метод имеет ряд ограничений. Он может оказаться избыточным и подходит далеко не для всех случаев. Применение подхода целесообразно лишь в определённых сценариях, где его преимущества действительно оправданы.
Symfony со стандартным набором возможностей представляет собой мощное и универсальное решение, способное справляться с широким спектром бизнес-задач. Существует подход, который известен далеко не каждому разработчику на Symfony, а если и известен, то чаще всего поверхностно и редко применяется на практике. Настало время подробнее рассмотреть эту менее известную, но интересную сторону фреймворка.
Один из таких подходов связан с использованием функциональности Doctrine, позволяющей возвращать готовые DTO, что избавляет разработчика от ручной работы по преобразованию данных. Этот процесс, известный как ResultTransformer, автоматизирует преобразование данных в DTO, значительно упрощая задачу программиста.
Однако, стоит учитывать, что этот метод имеет ряд ограничений. Он может оказаться избыточным и подходит далеко не для всех случаев. Применение подхода целесообразно лишь в определённых сценариях, где его преимущества действительно оправданы.
Хабр
ResultTransformer в Symfony проектах
Symfony со стандартным набором «батареек» представляет из себя монструозное решение, способное реализовать если и не любые, то очень многие задачи бизнеса. Поделюсь подходом, о котором...
👍4
Forwarded from Библиотека собеса по PHP | вопросы с собеседований
[Git] Зачем команда git bundle?
Команда
Основные случаи использования git bundle:
1. Передача репозитория офлайн:
Если репозиторий большой, но доступ к сети отсутствует, можно создать файл с полным содержимым репозитория и передать его через USB-накопитель или другое физическое устройство.
2.Обновление репозитория офлайн:
Если нужно синхронизировать изменения между двумя репозиториями без доступа к сети, можно упаковать изменения в bundle и передать его.
3. Создание резервной копии:
4. Доставка изменений:
Это удобный способ передать патчи или ветки, которые можно позже интегрировать в другой репозиторий.
Примеры использования:
Создание полного архива репозитория:
Здесь флаг
Упаковка определённой ветки:
Это создаст архив с содержимым только ветки main.
Проверка содержимого bundle:
Проверяет, что файл корректен и пригоден для использования.
Клонирование из bundle:
Команда
git bundle
используется для упаковки репозитория или его части в один файл. Этот файл можно передать, скопировать или сохранить, а затем использовать для восстановления или обновления репозитория в другом месте. Основное назначение этой команды — перенос изменений без необходимости наличия сетевого подключения, например, в случаях, когда доступ к удалённому репозиторию ограничен.Основные случаи использования git bundle:
1. Передача репозитория офлайн:
Если репозиторий большой, но доступ к сети отсутствует, можно создать файл с полным содержимым репозитория и передать его через USB-накопитель или другое физическое устройство.
2.Обновление репозитория офлайн:
Если нужно синхронизировать изменения между двумя репозиториями без доступа к сети, можно упаковать изменения в bundle и передать его.
3. Создание резервной копии:
git bundle
может использоваться для создания архива репозитория с сохранением всей истории.4. Доставка изменений:
Это удобный способ передать патчи или ветки, которые можно позже интегрировать в другой репозиторий.
Примеры использования:
Создание полного архива репозитория:
git bundle create my-repo.bundle --all
Здесь флаг
--all
указывает, что нужно упаковать все ветки и историю.Упаковка определённой ветки:
git bundle create my-feature.bundle main
Это создаст архив с содержимым только ветки main.
Проверка содержимого bundle:
git bundle verify my-repo.bundle
Проверяет, что файл корректен и пригоден для использования.
Клонирование из bundle:
git clone my-repo.bundle my-new-repo
❤14🔥7👍4