Библиотека собеса по PHP | вопросы с собеседований
Ir al canal en Telegram
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/9f3affba Для обратной связи: @proglibrary_feeedback_bot
Mostrar más3 148
Suscriptores
Sin datos24 horas
-37 días
-730 días
Archivo de publicaciones
Как масштабировать PHP-приложение, чтобы оно выдерживало высокую нагрузку, и каковы некоторые связанные с этим проблемы?
Для масштабирования PHP-приложения можно использовать горизонтальное масштабирование, при котором несколько экземпляров приложения могут работать на разных серверах за балансировщиком нагрузки. Это поможет справиться с высокой нагрузкой. Одной из проблем является обеспечение согласованности данных в нескольких экземплярах приложения.
Другая задача — обеспечить эффективную связь между экземплярами приложения и гарантировать, что каждый экземпляр имеет достаточно ресурсов, чтобы справиться с нагрузкой. Для снижения нагрузки на серверы можно также использовать методы кэширования и оптимизации.
🎭 Bytemask \\
Bytemask — плагин Gradle для Android, который маскирует секретные строки приложения в исходном коде, затрудняя их извлечение с помощью реверс-инжиниринга. Он шифрует строки во время компиляции с помощью ключа подписи приложения и расшифровывает во время выполнения.
Ссылка на Github
#полезное #библиотека
Как использовать репозиторий в контроллере в Symfony, написав код?
Чтобы использовать репозиторий в контроллере Symfony, выполните следующие шаги:
Определите репозиторий: Убедитесь, что у вас есть класс репозитория, определённый для вашей сущности. Symfony обычно автоматически генерирует эти классы при создании сущности.
Инжектируйте репозиторий в контроллер: Используйте внедрение зависимостей, чтобы инжектировать репозиторий в ваш контроллер. Это можно сделать через конструктор или напрямую в методе контроллера.
Опишите поведение при использовании traits с одинаковыми именами полей и / или методов?
При использовании traits с одинаковыми именами полей и/или методов, возникает конфликт имен, который не позволяет PHP однозначно определить, какое поле или метод должны использоваться.
Если в классе используется несколько traits, и в этих traits есть поля или методы с одинаковыми именами, возникает ошибка компиляции «trait method has not been applied», или «trait field has not been applied». По сути, PHP не знает, из какого trait следует взять поле или метод.
Для разрешения этого конфликта имен трейт может быть использован с использованием псевдонима. Например, можно использовать ключевое слово insteadof, чтобы указать, какой метод или поле должно использоваться
Также в PHP 7.2 и выше была добавлена возможность адаптировать методы или конфликтующие поля с помощью оператора as.
С помощью таких алиасов можно явным образом указать, какой метод или поле следует использовать из каждого трейта.
Как использовать принцип инверсии управления в Laravel?
Принцип инверсии управления(Inversion of Control, IoC) используется в Laravel для разделения реализации компонента и его использования. В Laravel это достигается за счет использования контейнера сервисов, который предоставляет возможность регистрировать и разрешать зависимости для вашего приложения. Вот пример использования контейнера сервисов для разрешения зависимостей
В этом примере мы используем контроллер UserController для отображения списка пользователей. Мы инжектируем экземпляр UserRepository в конструктор контроллера. Класс UserRepository отвечает за получение и хранение данных для модели User.
Используя инъекцию зависимостей, мы отделяем UserController от класса UserRepository. Это позволяет нам легко заменить UserRepository на другую реализацию, не меняя при этом код в UserController.
Что такое JIT? Как он работает?
JIT (Just-In-Time) компиляция представляет собой метод оптимизации выполнения кода, при котором код не компилируется заранее в процессе разработки, а только перед фактическим его выполнением во время работы программы. Это позволяет улучшить производительность программы за счет оптимизаций, которые могут быть применены с учетом конкретных условий выполнения.
Как это работает:
Исходный код на PHP: Начинаем с написания нашего кода на PHP, который является языком сценариев с динамической типизацией.
Компиляция в промежуточный код (opcode): Исходный код PHP компилируется в промежуточный байт-код, который представляет собой некий промежуточный представитель нашего кода, близкий к машинному коду, но все еще независимый от конкретной аппаратной платформы.
Исполнение байт-кода: Этот байт-код может быть интерпретирован непосредственно виртуальной машиной PHP (Zend VM), что происходит по умолчанию. Однако, в контексте JIT, в определенный момент, когда интерпретатор PHP обнаруживает, что некий участок кода используется достаточно часто, он может решить скомпилировать этот участок кода в машинный код «на лету».
JIT-компиляция: В процессе выполнения программы JIT-компилятор анализирует и оптимизирует участки кода, которые часто выполняются. Это позволяет улучшить производительность, так как оптимизации адаптированы к конкретному исполняющемуся коду и платформе.
Выполнение оптимизированного кода: После JIT-компиляции оптимизированный машинный код заменяет соответствующий участок байт-кода, что может значительно ускорить выполнение программы.
Этот подход позволяет более эффективно использовать ресурсы и достигнуть лучшей производительности в сравнении с чистым интерпретатором.
Как использовать «PHPUnit» для написания модульных тестов для PHP-приложений, и каковы лучшие практики для этого?
PHPUnit — это широко используемый фреймворк для написания модульных тестов в PHP. Он позволяет разработчикам писать тестовые примеры, чтобы убедиться, что отдельные части кода работают так, как ожидается.
Для запуска тестов можно использовать команду phpunit. Лучшие практики модульного тестирования включают в себя написание независимых, повторяемых и легко поддерживаемых тестов, использование фикстур для создания тестовых данных, а также тестирование как положительных, так и отрицательных случаев.
Что такое фильтр Блума?
Фильтр Блума — это вероятностная структура данных, которая используется для тестирования принадлежности элемента множеству. Он может давать ложные положительные результаты, но никогда не дает ложных отрицательных. Это значит, что если фильтр Блума говорит, что элемент принадлежит множеству, это может быть не так (ложное срабатывание), но если фильтр говорит, что элемент не принадлежит множеству, это точно так.
Подробнее в статье
Proglib запускает канал Азбука айтишника
Подписывайтесь на наш новый канал про айти для неайтишников — для совсем новичков и тех, кто постоянно взаимодействует с айтишниками.
У нас есть рубрики:
⭐ База — в ней рассказываем про термины из IT простым языком
⭐ Проект — объясняем, из чего состоят айтишные проекты и сколько они могут стоить
⭐ Психология айтишника — тут говорим про софт-скиллы, особенности работы и взаимодействия
👉Подписывайтесь!
Каковы основные компоненты Symfony и как они взаимодействуют друг с другом?
Symfony состоит из нескольких ключевых компонентов, которые взаимодействуют между собой, создавая надежный PHP-фреймворк. Компонент HttpFoundation заменяет глобальные переменные PHP объектно-ориентированным слоем, что позволяет проще работать с HTTP-запросами и ответами. Routing управляет генерацией и подбором URL, а EventDispatcher позволяет разделить код с помощью слушателей событий. DependencyInjection обеспечивает функциональность контейнера сервисов, способствуя многократному использованию и тестированию кода.
HttpKernel выступает в качестве ядра, используя другие компоненты для обработки запросов и генерации ответов. Он использует EventDispatcher для отправки нескольких событий во время обработки запроса, что позволяет внедрять пользовательское поведение в различных точках. Например, он отправляет событие 'kernel.request', которое может быть использовано Routing для сопоставления запроса с маршрутом и определения контроллера.
Компонент Twig — это шаблонизатор Symfony, взаимодействующий с HttpKernel для рендеринга представлений. Doctrine ORM взаимодействует с базой данных, обеспечивая персистентность данных.
Security обеспечивает аутентификацию и авторизацию, тесно взаимодействуя с HttpKernel и EventDispatcher. Translation помогает в интернационализации, а Validator обеспечивает соблюдение правил проверки объектов.
👀Что из этого сгенерировала нейросеть?
Подписывайтесь на наш новый канал про нейросети для создания изображений, там есть:
🌸Новые нейросети и инструменты, например, вот модель генерирует картинки по наброску
🌸Промты для разных задач
🌸Лайфхаки по использованию нейросетей
👉Подписывайтесь!
🎮Новый канал по разработке игр
Мы наконец-то запустили канал по разработке игр — теперь все самое важное и полезное из мира геймдева можно узнать в одном месте.
👉Подписаться
Что такое traits?
Traits в PHP — это механизм, который позволяет повторно использовать код в классах без необходимости использования множественного наследования. Traits предоставляют решение для проблемы, когда несколько классов должны иметь одинаковый функционал, но наследование не является подходящим вариантом.
Также traits позволяют разделить функционал, что упрощает структуру кода и делает его более логичным и понятным.
Альтернативным решением для использования функционала traits может быть использование интерфейсов. Однако интерфейсы требуют реализации всех методов, которые определены в интерфейсе, в классе, в то время как трейты могут предоставлять реализацию функционала по умолчанию.
Оба варианта имеют свои преимущества, но трейты в PHP предоставляют большую гибкость при повторном использовании кода в разных классах.
Так как каждый класс может реализовать множество трейтов, могут возникать конфликты когда один и тот же метод реализован в разных трейтах и/или самом классе. Подробней о трейтах в документации.
Как использовать Eager loading в Laravel?
Eager loading в Laravel — это способ предварительной загрузки связанных моделей, чтобы уменьшить количество запросов к базе данных и повысить производительность приложения. При использовании ленивой загрузки (lazy loading) связанные данные загружаются только тогда, когда к ним обращаются, что может привести к множественным запросам к базе данных (проблема N+1 запросов). В то время как eager loading загружает все необходимые данные заранее, используя объединение (join) или отдельные запросы с использованием ключевого слова with.
Eager loading помогает значительно снизить нагрузку на базу данных и ускорить работу приложения за счет уменьшения количества выполняемых запросов.
✍️Библиотека программиста» находится в поиске автора оригинальных статей
Кто нужен?
● Энтузиасты (джуны и выше), которые держат руку на пульсе, читают помимо книг зарубежные техноблоги
● Энтузиасты, которым есть что сказать
Тематика
● DevOps
● В четырех случаях из пяти вы предлагаете тему статьи
Объем
● От 7 до 15 тыс. знаков без учета кода
● 2-3 статьи в месяц
Оплата
● 8к руб. за статью
● Работаем с самозанятыми (компенсируем налог), ИП
Я пишу «так себе», что делать?
Чтобы написать статью, которую не стыдно опубликовать, достаточно овладеть инфостилем. У нас есть бесплатный курс для начинающих копирайтеров «Статьи для IT: как объяснять и распространять значимые идеи». Время прохождения курса: 1-2 недели.
✉️Пишите на hello@proglib.io
Как хранятся данные в redis / memcached?
В Redis данные хранятся в оперативной памяти, что обеспечивает высокую скорость доступа к данным. Redis использует структуру данных, называемую ключ-значение (key-value). Каждое значение хранится под уникальным ключом, который позволяет быстро найти и получить доступ к этим данным.
Redis поддерживает различные типы данных, включая строки, списки, множества, сортированные множества (sorted sets) и хэши. Например, для хранения строки в Redis можно использовать команду SET, где ключ — это уникальное имя, а значение — сама строка. По ключу можно получить или изменить значение, используя команду GET или SET соответственно.
Memcached также использует ключ-значение для хранения данных, но данные хранятся в оперативной памяти сервера. Memcached не поддерживает различные типы данных, он хранит все данные как массивы байтов. Обращение к данным в Memcached происходит с использованием ключа и команд get и set, похожих на Redis.
Оба этих инструмента являются ин-memory кешами, которые используются для ускорения доступа к данным, предоставляя быструю запись или чтение из оперативной памяти, минуя долгие операции чтения или записи на диск. При этом данные в Redis и Memcached не являются постоянными, поскольку они хранятся только в памяти компьютера, а не на диске. Они предназначены для хранения временных данных или данных, к которым часто обращаются.
Что такое типы форм Symfony (Symfony Form Types)?
Типы форм Symfony (Symfony Form Types) являются ключевым компонентом форм Symfony, которые предоставляют способ работы с формами в веб-приложениях. Типы форм определяют структуру и поведение формы, включая поля, которые она содержит, их типы, валидации и обработку данных.
Вот как работают типы форм Symfony:
Определение: Типы форм определяются как классы PHP, которые наследуются от класса AbstractType Symfony. Эти классы определяют поля формы, их типы, опции и любые правила валидации.
Конфигурация полей: Внутри класса типа формы вы определяете поля формы, используя методы, такие как buildForm() или configureOptions(). В этих методах вы указываете тип каждого поля (например, текст, флажок, дата) вместе с любыми опциями и ограничениями.
Отображение: Система шаблонов Symfony автоматически отображает форму на основе конфигурации, предоставленной в классе типа формы. Вы можете настроить отображение, переопределяя шаблоны или используя систему тем оформления форм Symfony.
Обработка данных: Типы форм Symfony автоматически обрабатывают привязку данных, преобразование и валидацию. Когда форма отправляется, Symfony сопоставляет отправленные данные с соответствующими полями и проверяет их в соответствии с ограничениями, определенными в типе формы.
Повторное использование: Типы форм могут использоваться повторно в разных частях приложения. Это способствует повторному использованию кода и поддерживаемости, инкапсулируя логику формы в переиспользуемый класс.
Обработка событий: Компонент форм Symfony предоставляет события, которые позволяют вам встраиваться в жизненный цикл формы и выполнять пользовательскую логику на различных этапах, таких как отправка формы или преобразование данных.
Объясните Path Traversal в PHP
Path traversal (траверсирование путей) — это уязвимость безопасности, которая возникает, когда приложение позволяет пользователям указывать пути к файлам и не выполняет должную очистку пользовательского ввода. Это может позволить злоумышленникам получить доступ к файлам и директориям, находящимся вне предусмотренной директории. В PHP эта уязвимость может возникнуть, когда пути к файлам конструируются с использованием пользовательского ввода без надлежащей валидации или очистки.
Как работает Path Traversal
Пользовательский ввод: Приложение принимает пользовательский ввод для путей к файлам, например, через параметр GET или POST.
Неправильная очистка: Приложение неправильно очищает или валидирует ввод.
Траверсирование директорий: Злоумышленник может манипулировать вводом для навигации по файловой системе с помощью последовательностей вроде ../ (точка-точка-слэш) для перемещения вверх по структуре директорий.
Несанкционированный доступ к файлам: Злоумышленник получает доступ к файлам и директориям за пределами предусмотренного диапазона, который может включать конфиденциальную информацию, например, конфигурационные файлы, файлы с паролями или другие конфиденциальные данные.
Меры по предотвращению уязвимостей Path Traversal
Чтобы предотвратить уязвимости path traversal в PHP, следует:
🟢Очистка пользовательского ввода: Использовать функции, которые валидируют и очищают имена файлов.
🟢Использование абсолютных путей: Преобразовывать пути в абсолютные и проверять, что они находятся в ожидаемой директории.
🟢Ограничение доступа к файлам: Использовать подход белого списка, чтобы разрешить доступ только к определенным файлам.
Как найти и оптимизировать «тяжелые» запросы?
1. Используйте инструменты мониторинга базы данных:
Используйте инструменты мониторинга базы данных, такие как MySQL's slow query log или PostgreSQL's pg_stat_statements. Они позволяют отслеживать запросы, которые выполняются слишком долго.
2. Используйте индексы:
Убедитесь, что таблицы имеют подходящие индексы. Индексы ускоряют поиск данных и сокращают время выполнения запросов. Анализируйте запросы и убедитесь, что они используют подходящие индексы.
3. Оптимизация запросов:
Пересмотрите медленные запросы и убедитесь, что они оптимальны. Используйте EXPLAIN в MySQL или PostgreSQL для анализа выполнения запроса и определения, какие части запроса требуют оптимизации.
4. Пакетные запросы (Batch Queries):
Используйте пакетные запросы, чтобы уменьшить количество обращений к базе данных. Вместо того, чтобы выполнять несколько отдельных запросов, объедините их в один пакетный запрос.
5. Используйте кэширование:
Рассмотрите возможность использования кэширования запросов. Кэширование может значительно уменьшить количество запросов к базе данных, особенно для запросов, результаты которых редко меняются.
6. Оптимизация таблиц:
Регулярно анализируйте и оптимизируйте структуру таблиц в базе данных. Убедитесь, что таблицы правильно нормализованы и оптимизированы для типа запросов, которые они будут выполнять.
7. Используйте кеширование результатов:
Если запросы возвращают одинаковые результаты для одних и тех же входных данных, рассмотрите возможность кеширования результатов запросов. Популярные решения включают Redis или Memcached для кеширования данных.
8. Используйте инструменты профилирования кода:
Используйте профилирование кода для определения, какие части вашего приложения требуют больше всего времени выполнения. Это поможет вам сосредоточиться на оптимизации наиболее критичных участков кода.
Как определить маршрут в Laravel?
В Laravel маршруты определяются в файле routes/web.php для веб-маршрутов и в файле routes/api.php для маршрутов API.
Чтобы определить маршрут в Laravel, вы используете фасад Route. Фасад Route предоставляет несколько методов для определения различных типов маршрутов, таких как get, post, put, patch, delete и другие.
В нашем примере мы определяем несколько маршрутов, которые обрабатываются классом UserController. Метод index обрабатывает маршрут /users GET, метод show обрабатывает маршрут /users/{id} GET, метод store — маршрут /users POST и так далее.
Подробнее в документации.
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
