Библиотека собеса по PHP | вопросы с собеседований
3.36K subscribers
139 photos
2 videos
69 links
Вопросы с собеседований по PHP и ответы на них.

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Какие существуют уязвимости, связанные с unserialize(), и как их избежать?

Функция unserialize() в PHP преобразует сериализованную строку обратно в соответствующий объект или значение. Однако её использование может привести к серьёзным уязвимостям, особенно если данные для десериализации поступают из ненадёжных источников. Основные риски включают:

1. Инъекция объектов (Object Injection)
Злоумышленник может передать специально сформированные данные в unserialize(), что приведёт к созданию объектов нежелательных классов. Если эти классы содержат методы, выполняющие опасные действия при инициализации или уничтожении объектов (например, магические методы __wakeup() или __destruct()), это может привести к выполнению произвольного кода.

2. Использование освобождённой памяти (Use-After-Free)
Некоторые уязвимости связаны с ошибками в механизме управления памятью PHP, что может позволить злоумышленнику выполнить произвольный код через функцию unserialize().

Рекомендации по предотвращению уязвимостей:
Избегайте десериализации данных из ненадёжных источников. Если это неизбежно, используйте второй параметр unserialize() для ограничения допустимых классов:

$data = unserialize($input, ['allowed_classes' => false]);


Это предотвратит создание объектов произвольных классов.

🔸 Рассмотрите альтернативные методы сериализации, такие как JSON, которые не поддерживают сериализацию объектов и, следовательно, безопаснее при обработке пользовательских данных.

🔸 Обновляйте PHP и используемые библиотеки до последних версий, где многие уязвимости уже исправлены.

🔸 Реализуйте строгую валидацию и санитизацию входящих данных, особенно если они будут десериализованы.

🔸 Соблюдение этих рекомендаций поможет защитить приложения от потенциальных атак, связанных с небезопасной десериализацией данных.

Библиотека собеса по PHP
Каково назначение файла app/Providers/AppServiceProvider.php в Laravel?

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

Вот основные цели и использования файла AppServiceProvider.php:

Регистрация служб:

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

Инициализация:

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

Настройка привязок служб:

Вы можете привязывать пользовательские реализации к интерфейсам, что позволяет приложению разрешать зависимости с использованием контейнера служб.
Расширение базовой функциональности:

Вы можете использовать файл AppServiceProvider.php для расширения или настройки базовой функциональности Laravel. Например, вы можете добавить пользовательские правила валидации, макросы или другие утилиты, которые может использовать ваше приложение.

Библиотека собеса по PHP
Расскажите о ReactPHP

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

Вот некоторые ключевые особенности и концепции ReactPHP:

Асинхронность: Основной принцип ReactPHP — это асинхронное выполнение кода. Вместо блокирования выполнения на операциях ввода-вывода, код может переключаться между задачами, ожидая выполнения операций ввода-вывода. Это позволяет эффективно обрабатывать множество соединений одновременно.

Event Loop: ReactPHP использует событийный цикл (event loop), который является центральной частью асинхронной архитектуры. Event loop отслеживает и обрабатывает различные события, такие как завершение операций ввода-вывода или таймеры.

Promise: Обещания (Promise) в ReactPHP представляют собой абстракцию для асинхронных операций. Они позволяют создавать цепочки асинхронных операций, которые будут выполнены после завершения предыдущей операции. Это сделано для более удобного и читаемого управления асинхронным кодом.

Компоненты: ReactPHP предоставляет различные компоненты и библиотеки для обработки конкретных задач. Например, React/Socket обеспечивает низкоуровневый доступ к сокетам, а React/Http предоставляет возможность создания веб-серверов.

Веб-сервер: ReactPHP можно использовать для создания высокопроизводительных веб-серверов. Это особенно полезно для обработки множества одновременных подключений, таких как веб-сокеты или длительные соединения.

Библиотека собеса по PHP
Библиотека собеса по PHP | вопросы с собеседований pinned «🏃‍♀️ 40+ каналов, которые должен читать каждый разработчик Отобрали для вас полезные и проверенные каналы для программистов — в них вы найдете все самое интересное, от технических новостей до практических гайдов. IT Job Hub | Работа и вакансии в IT — избранные…»
Как можно профилировать производительность PHP-кода? Какие инструменты использовать?

Профилирование PHP-кода позволяет выявить узкие места в производительности приложения, оптимизировать использование ресурсов и улучшить общую эффективность работы. Ниже представлены основные инструменты, используемые для профилирования PHP-приложений:

1. Xdebug
Xdebug — это мощное расширение для PHP, предоставляющее возможности отладки и профилирования. Оно собирает информацию о выполнении функций, использовании памяти и времени выполнения, что помогает анализировать производительность кода.

Особенности:

🔸Поддержка трассировки стека вызовов функций.
🔸Сбор данных о потреблении памяти и времени выполнения.
🔸Интеграция с различными IDE, такими как PhpStorm.

2. XHProf
XHProf — это легковесный инструмент для иерархического профилирования, разработанный Facebook. Он предоставляет информацию о времени выполнения функций и их взаимосвязях, что помогает выявлять узкие места в производительности.

Особенности:

🔸Сбор данных о времени выполнения и потреблении памяти.
🔸Визуализация данных профилирования через веб-интерфейс.

3. Blackfire
Blackfire — это современный профайлер для PHP-приложений, предоставляющий детальный анализ производительности. Он позволяет профилировать как веб-запросы, так и команды CLI, предоставляя информацию о потреблении ресурсов и времени выполнения.

Особенности:

🔸Интеграция с различными CI/CD системами.
🔸Возможность сравнения профилей для отслеживания изменений в производительности.
🔸Поддержка профилирования API и веб-сервисов.

4. phpspy
phpspy — это легковесный инструмент для профилирования PHP, работающий без вмешательства в код приложения. Он снимает стеки вызовов из работающих PHP-процессов, что делает его полезным для профилирования в продакшене.

Особенности:

🔸Низкое влияние на производительность приложения.
🔸Поддержка работы в реальном времени.

5. KCachegrind и Webgrind
KCachegrind — это графический инструмент для анализа данных профилирования, совместимый с Xdebug и XHProf. Webgrind — это веб-интерфейс для анализа профилей, предоставляющий основные функции для анализа производительности.

Особенности:

🔸Графическое отображение данных профилирования.
🔸Поддержка различных форматов профилей.

6. SonarQube
SonarQube — это платформа для непрерывного анализа и измерения качества кода, поддерживающая PHP. Она помогает выявлять потенциальные ошибки, проблемы стиля кодирования и другие аспекты, влияющие на производительность и безопасность приложения.

Особенности:

🔸Анализ кода на соответствие стандартам.
🔸Отчеты о техническом долге и рекомендации по улучшению.
Расскажите об обработке ошибок и исключения (try catch, finaly и throw).

Обработка ошибок и исключений в PHP осуществляется с помощью конструкции try-catch-finally и оператора throw.

1. Конструкция try-catch-finally:
- Код, который может вызывать исключение, помещается внутри блока try.
- Если исключение происходит внутри блока try, то программа переходит в соответствующий блок catch.
- Блок catch содержит код, выполняемый в случае возникновения исключения. Он принимает один параметр — само исключение.
- Блок finally является необязательным и содержит код, который выполняется в любом случае, независимо от того, было ли исключение или нет.

2. Оператор throw:
- Оператор throw используется для создания исключения.
- Он позволяет выбросить исключение вручную, указав класс исключения или объект исключения.
- Класс исключения может быть предопределенным классом, таким как Exception, или пользовательским классом, унаследованным от встроенного класса Exception.

Таким образом, использование конструкции try-catch-finally и оператора throw позволяет обрабатывать ошибки и исключения в PHP, обеспечивая контроль над выполнением программы и выводом информации об ошибках для более качественной отладки и управления кодом.
Что такое Bundles в Symfony?

В Symfony, Bundle (Бандл) — это структурированный набор файлов и директорий, реализующих определённую функцию или набор связанных функций в приложении Symfony. Бандлы являются основными единицами организации в проекте Symfony, позволяя упаковывать повторно используемый код и делиться им между несколькими проектами.

Вот некоторые ключевые аспекты бандлов в Symfony:

1. Структура и организация
Бандлы предоставляют способ организовать код в логические единицы. Каждый бандл обычно включает:

✔️Контроллеры
✔️Модели/Сущности
✔️Сервисы
✔️Конфигурационные файлы
✔️Шаблоны (файлы Twig)
✔️Информацию о маршрутах

2. Повторное использование
Бандлы могут быть повторно использованы в разных проектах Symfony. Это упрощает совместное использование и распространение функций и функциональных возможностей, способствуя модульности и поддерживаемости.

3. Разделение
Бандлы помогают разделить различные части приложения. Это разделение гарантирует, что изменения в одном бандле не влияют на функциональность других, что облегчает обслуживание и разработку.

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

5. Конфигурация
Бандлы могут быть настроены с помощью файлов конфигурации YAML, XML или PHP. Это позволяет настроить поведение бандла в соответствии с потребностями вашего приложения.

6. Лучшие практики
Symfony рекомендует использовать стандартную структуру директорий для бандлов, которая включает:

Controller/: Содержит классы контроллеров.
Resources/config/: Содержит конфигурационные файлы.
Resources/views/: Содержит шаблоны Twig.
Resources/public/: Содержит общедоступные ресурсы, такие как CSS и JavaScript файлы.
DependencyInjection/: Содержит классы и конфигурации, связанные с внедрением зависимостей.
Entity/: Содержит классы сущностей Doctrine.
Почему php -r «echo (int) ((0.1+0.7)*10);» выводит 7, а не 8?

В PHP выражение php -r «echo (int) ((0.1 + 0.7) * 10);» выводит 7 вместо ожидаемого 8 из-за особенностей представления чисел с плавающей точкой в компьютерах. Числа, такие как 0.1 и 0.7, не могут быть точно представлены в двоичной системе, что приводит к небольшим погрешностям при вычислениях. В данном случае, результат выражения (0.1 + 0.7) * 10 может быть немного меньше 8, например, 7.999999999999999, и при приведении к целому типу ((int)) дробная часть отбрасывается, давая результат 7.

Рекомендуемые подходы для получения ожидаемого результата:

Округление перед приведением к целому числу:

Используйте функцию round() для округления значения до ближайшего целого перед приведением к типу int:
echo (int) round((0.1 + 0.7) * 10); // выводит 8


Форматирование с заданной точностью:

Примените функцию sprintf() для форматирования числа с определённой точностью перед приведением:
echo (int) sprintf('%.0f', (0.1 + 0.7) * 10); // выводит 8


Использование математических функций произвольной точности:

Для повышения точности вычислений можно использовать функции из расширения bcmath:
echo bcmul(bcadd('0.1', '0.7', 1), '10', 0); // выводит 8