Библиотека собеса по PHP | вопросы с собеседований
3.14K subscribers
187 photos
6 videos
123 links
Вопросы с собеседований по PHP и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/9f3affba

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что вы знаете о дескрипторах в Symfony?

В Symfony дескрипторы используются для преобразования объектов и связанной с ними метаданных в различные форматы вывода, такие как текст, XML или JSON. Дескрипторы особенно полезны для отображения информации в консольных командах, генерации документации API или предоставления метаданных в различных форматах для других целей.

Назначение и использование

Дескрипторы в Symfony помогают разработчикам представлять подробную информацию об объектах (например, о командах, маршрутах, сервисах, событиях и т. д.) в согласованном и структурированном виде. Это особенно полезно, когда нужно предоставить читаемый человеком вывод или данные, понятные для машин.

Распространенные случаи использования

✔️Консольные команды: Когда вы выполняете консольную команду Symfony с опцией --help, дескрипторы используются для форматирования и отображения текста справки по команде.
✔️Информация о маршрутизации: Дескрипторы могут использоваться для отображения информации о маршрутизации в различных форматах.
✔️Информация о сервисах: Они также могут описывать сервисы в контейнере сервисов.

Основные компоненты

DescriptorInterface: Этот интерфейс определяет контракт для дескрипторов. Любой дескриптор должен реализовать этот интерфейс и его метод describe.
AbstractDescriptor: Это абстрактный класс, который реализует некоторую общую логику для дескрипторов. Он помогает уменьшить дублирование кода среди различных реализаций дескрипторов.

Специфические дескрипторы: Symfony предоставляет несколько встроенных дескрипторов, таких как:

🟢TextDescriptor
🟢XmlDescriptor
🟢JsonDescriptor
🟢MarkdownDescriptor

Расширение дескрипторов

Если встроенные дескрипторы не удовлетворяют вашим потребностям, вы можете создать собственные дескрипторы, реализовав DescriptorInterface. Это позволит вам адаптировать вывод под ваши конкретные требования.
Что такое микросервисная архитектура?

Микросервисная архитектура — это подход к разработке программного обеспечения, в котором приложение разбивается на небольшие, автономные и слабо связанные между собой сервисы, каждый из которых отвечает за конкретную функциональность. Эти сервисы взаимодействуют друг с другом посредством использования API, что позволяет им работать независимо друг от друга.

При использовании микросервисной архитектуры, каждый сервис может быть написан на разных языках программирования, иметь свою собственную базу данных и даже развертываться на отдельных серверах. Это позволяет достичь высокой гибкости, масштабируемости и возможности независимого развертывания и сопровождения каждого сервиса.

Преимущества микросервисной архитектуры включают легкость поддержки и развертывания, возможность параллельной разработки и обновления, улучшенную масштабируемость и реактивность системы, а также лучшую изоляцию и отказоустойчивость приложения.
Какие основные отличия PHP-FPM от модульного PHP в Apache?

Основные отличия PHP-FPM и модульного PHP в Apache (mod_php):

1. Способ работы и исполнения кода

PHP-FPM (FastCGI Process Manager)

🔸Запускается как отдельный процесс и обрабатывает запросы через протокол FastCGI.
🔸Веб-сервер (Apache, Nginx, Caddy и др.) передает запросы PHP-FPM через сокет или TCP.
🔸PHP-код выполняется в отдельных процессах, не зависящих от веб-сервера.

mod_php (Apache Module)

🔸PHP встраивается в сам Apache в виде модуля.
🔸Код выполняется внутри самого веб-сервера без необходимости передавать запросы во внешний процесс.
🔸Работает только с Apache, не совместим с Nginx.

2. Производительность и ресурсы

PHP-FPM:
Лучше масштабируется, так как поддерживает динамическое управление процессами.
Можно настроить пулы воркеров с разными конфигурациями (например, разное количество процессов для разных сайтов).
Меньше потребляет память, так как процессы PHP разделены от веб-сервера.
Небольшой оверхед на передачу запросов между веб-сервером и PHP-FPM.

mod_php:
Обрабатывает PHP быстрее внутри Apache, без передачи данных во внешний процесс.
Простая настройка, так как PHP уже встроен в сервер.
Занимает больше оперативной памяти, так как каждый Apache-процесс содержит PHP-интерпретатор.
Плохо масштабируется: каждый запрос создает новый процесс Apache, что быстро потребляет ресурсы.

3. Гибкость и настройки

PHP-FPM:

🔹Позволяет задать разные настройки PHP для разных виртуальных хостов (пулы процессов).
🔹Можно легко использовать разные версии PHP на одном сервере.
🔹Гибкие настройки управления процессами (pm.dynamic, pm.max_children и т. д.).

mod_php:

🔹Одна конфигурация PHP для всего сервера.
🔹Нет гибкого управления процессами (сколько процессов запущено — контролирует Apache).

4. Безопасность

PHP-FPM:

Запускает процессы от разных пользователей (разграничение прав между сайтами).
Уменьшает риск исполнения чужого кода на общем сервере.

mod_php:

Все PHP-скрипты работают от имени одного пользователя (обычно www-data или apache).
В многосайтовой среде сайты могут получить доступ друг к другу.

5. Поддержка серверов
PHP-FPM: Работает с Apache, Nginx, Caddy и другими серверами.
mod_php: Работает только с Apache.

📌 Вывод: что выбрать?
Если нужен Nginx, масштабируемость, безопасность и гибкость → PHP-FPM.
Если нужен простой и быстрый запуск PHP на Apache, без сложных настроек → mod_php (но для продакшена редко используется).
PHP-FPM — более современное и предпочтительное решение для большинства проектов. 🚀
Что такое область запросов(query scope) в Laravel и как она используется?

Область запросов в Laravel — это способ инкапсуляции многократно используемой логики запросов в модели. Определяя области запросов, мы можем сделать наши модели более выразительными и удобными в работе. Области запросов — это, по сути, готовые запросы, которые можно применить в конструкторе запросов модели.

Чтобы определить область запросов в Laravel, мы создаем публичный метод в модели, который возвращает экземпляр конструктора запросов. Затем мы можем использовать эту область в запросе, вызвав метод на модели.
Расскажите о целесообразности применения redis / memcached для кэширования. Какие плюсы и минусы?

Использование Redis или Memcached для кэширования — это общепринятая практика в веб-разработке и может предоставить несколько преимуществ.

Плюсы:

1. Ускорение работы приложения: Как кэш-серверы, Redis и Memcached хранят данные в оперативной памяти, что значительно ускоряет чтение и запись данных. Они могут быть использованы для кэширования запросов к базе данных, результатов тяжелых расчетов или рендеринга представлений, что помогает снизить время отклика приложения.

2. Масштабируемость: Redis и Memcached могут быть легко масштабированы по горизонтали, добавляя дополнительные серверы для распределения нагрузки. Это позволяет активно использовать гораздо больше ресурсов, чем один сервер может предоставить.

3. Постоянность данных: Redis позволяет сохранять данные на диске, что гарантирует их сохранность и после перезапуска сервера. Это важно, если важно избежать потери кэшированных данных.

4. Поддержка структурированных данных: Redis предлагает не только простое кэширование простых строковых значений, но и поддерживает сложные структуры данных, такие как списки, хэши и наборы. Это полезно при работе с данными, которые должны быть организованы в определенном порядке или для решения сложных задач.

5. Полезные функции: Кроме возможности кэширования, Redis и Memcached предлагают различные функции, которые могут быть полезными в разработке, такие как публикация/подписка, блокирующее чтение данных и транзакции.

Минусы:

1. Ограничение доступности: Поскольку данные хранятся в оперативной памяти, Redis и Memcached могут оказаться недоступными в случае перезапуска или сбоя сервера. Это означает, что при использовании их в качестве кэша, ваше приложение должно быть готово обрабатывать ситуации, когда кэш недоступен.

2. Ограничение места хранения: В отличие от баз данных, память Redis и Memcached ограничена объемом физической памяти на сервере. Если ваше приложение требует очень большой памяти для хранения данных, может потребоваться использование дополнительных серверов или другой подход к кэшированию.

3. Отсутствие типов данных: Memcached предлагает только возможность кэширования простых строковых данных, в то время как Redis поддерживает структурированные данные. Если вам необходимо хранить сложные данные или использовать сложные запросы, Redis может оказаться предпочтительнее.

4. Сложность настройки: Настройка Redis и Memcached может быть немного сложной для начинающих разработчиков. Вам необходимо правильно настроить экземпляры серверов, определить логику кэширования и обрабатывать ситуации, когда кэш недоступен. Это может потребовать определенного уровня знаний и опыта.
👍1