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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что такое планировщик задач в Laravel и как он используется?

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

Вот как вы можете использовать его:

Определение запланированных задач: Вы можете определить все свои запланированные задачи в методе schedule класса App\Console\Kernel.

Запуск планировщика задач: Чтобы запустить планировщик Laravel, вам нужно добавить следующую запись Cron на ваш сервер.

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Этот Cron будет вызывать команду планировщика Laravel каждую минуту для выполнения запланированных задач.

Помните, что будут выполняться только задачи, которые должны быть выполнены. Команда schedule:run будет проверять расписание задач и выполнять все задачи, которые должны быть выполнены.

Ограничения задач: Вы также можете добавить дополнительные ограничения к расписанию, такие как ->weekdays(), ->sundays(), ->at('13:00') и т.д.

Вывод задач: По умолчанию вывод запланированных задач будет направлен в /dev/null. Вы можете использовать методы sendOutputTo и appendOutputTo для записи или добавления вывода в определенный файл.
🥱6👍3
Офер от Сбера за один клик 💼

Мечтаешь работать в Сбере, теперь это проще, чем когда-либо!

💡 AI-интервью за 15 минут – и ты уже на шаг ближе к своей новой работе.

Как получить офер?

📌 Зарегистрируйся
📌 Пройди AI-интервью
📌 Получи обратную связь сразу же!

После прохождения твои ответы получат рекрутеры и свяжутся с тобой в течение нескольких дней! 🚀

Реклама. ПАО СБЕРБАНК, ИНН 7707083893. Erid 2VtzqxS96Na
🥱4
Media is too big
VIEW IN TELEGRAM
⚙️ Как работает API

Proglib рассказывает базу в формате рилса
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1😁1🥱1
🏃‍♀️ 40+ каналов, которые должен читать каждый разработчик

Отобрали для вас полезные и проверенные каналы для программистов — в них вы найдете все самое интересное, от технических новостей до практических гайдов.

IT Job Hub | Работа и вакансии в IT — избранные IT-вакансии

Библиотека программиста — новости из мира IT и технологий

Книги для программистов — самые годные книги по любым языкам и стекам

IT-мемы — мемы про жизу айтишника

Proglib Academy — обучение и курсы, чтобы стать топовым специалистом

Азбука айтишника — азы из мира разработки

Библиотека нейросетей — лайфхаки и промпты для разных задач, баттлы нейронок и новости из мира ИИ

Библиотека фронтендера — все о JS, React, Angular и не только

Библиотека мобильного разработчика — лайфхаки и новости из мира Swift и Kotlin

Библиотека хакера — уязвимости, атаки, бэкдоры и как от них защититься

Библиотека тестировщика — самое интересное о том, как крашить код

🦫 Go
Библиотека Go-разработчика
Библиотека задач по Go
Библиотека Go для собеса
Вакансии по Go

#️⃣ C#
Библиотека шарписта
Библиотека задач по C#
Библиотека собеса по C#
Вакансии по C#

🔧 DevOps
Библиотека devops’а
Библиотека задач по DevOps
Библиотека собеса по DevOps
Вакансии по DevOps & SRE

🐘 PHP
Библиотека пхпшника
Библиотека задач по PHP
Библиотека PHP для собеса
Вакансии по PHP, Symfony, Laravel

🐍 Python
Библиотека питониста
Библиотека Python для собеса
Библиотека задач по Python
Вакансии по питону, Django, Flask

☕️ Java
Библиотека джависта
Библиотека задач по Java
Библиотека Java для собеса
Вакансии по Java

📊 Data Science
Библиотека дата-сайентиста
Библиотека задач по Data Science
Библиотека Data Science для собеса
Вакансии по Data Science

🎮 C++
Библиотека C/C++ разработчика
Библиотека задач по C++
Библиотека C++ для собеса
Вакансии по C++

Подписывайтесь на интересные вам каналы и сохраняйте пост в закладки, чтобы не потерять 🔑
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Библиотека собеса по PHP | вопросы с собеседований pinned «🏃‍♀️ 40+ каналов, которые должен читать каждый разработчик Отобрали для вас полезные и проверенные каналы для программистов — в них вы найдете все самое интересное, от технических новостей до практических гайдов. IT Job Hub | Работа и вакансии в IT — избранные…»
Что такое 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.
👍8
Почему 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
👍11
Как найти и оптимизировать «тяжелые» запросы?

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. Используйте инструменты профилирования кода:

Используйте профилирование кода для определения, какие части вашего приложения требуют больше всего времени выполнения. Это поможет вам сосредоточиться на оптимизации наиболее критичных участков кода.
👍2
Объясните Path Traversal в PHP

Path traversal (траверсирование путей) — это уязвимость безопасности, которая возникает, когда приложение позволяет пользователям указывать пути к файлам и не выполняет должную очистку пользовательского ввода. Это может позволить злоумышленникам получить доступ к файлам и директориям, находящимся вне предусмотренной директории. В PHP эта уязвимость может возникнуть, когда пути к файлам конструируются с использованием пользовательского ввода без надлежащей валидации или очистки.

Как работает Path Traversal

Пользовательский ввод: Приложение принимает пользовательский ввод для путей к файлам, например, через параметр GET или POST.
Неправильная очистка: Приложение неправильно очищает или валидирует ввод.
Траверсирование директорий: Злоумышленник может манипулировать вводом для навигации по файловой системе с помощью последовательностей вроде ../ (точка-точка-слэш) для перемещения вверх по структуре директорий.
Несанкционированный доступ к файлам: Злоумышленник получает доступ к файлам и директориям за пределами предусмотренного диапазона, который может включать конфиденциальную информацию, например, конфигурационные файлы, файлы с паролями или другие конфиденциальные данные.

Меры по предотвращению уязвимостей Path Traversal

Чтобы предотвратить уязвимости path traversal в PHP, следует:

🟢Очистка пользовательского ввода: Использовать функции, которые валидируют и очищают имена файлов.
🟢Использование абсолютных путей: Преобразовывать пути в абсолютные и проверять, что они находятся в ожидаемой директории.
🟢Ограничение доступа к файлам: Использовать подход белого списка, чтобы разрешить доступ только к определенным файлам.
👍4
Что такое типы форм Symfony (Symfony Form Types)?

Типы форм Symfony (Symfony Form Types) являются ключевым компонентом форм Symfony, которые предоставляют способ работы с формами в веб-приложениях. Типы форм определяют структуру и поведение формы, включая поля, которые она содержит, их типы, валидации и обработку данных.

Вот как работают типы форм Symfony:

Определение: Типы форм определяются как классы PHP, которые наследуются от класса AbstractType Symfony. Эти классы определяют поля формы, их типы, опции и любые правила валидации.

Конфигурация полей: Внутри класса типа формы вы определяете поля формы, используя методы, такие как buildForm() или configureOptions(). В этих методах вы указываете тип каждого поля (например, текст, флажок, дата) вместе с любыми опциями и ограничениями.

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

Обработка данных: Типы форм Symfony автоматически обрабатывают привязку данных, преобразование и валидацию. Когда форма отправляется, Symfony сопоставляет отправленные данные с соответствующими полями и проверяет их в соответствии с ограничениями, определенными в типе формы.

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

Обработка событий: Компонент форм Symfony предоставляет события, которые позволяют вам встраиваться в жизненный цикл формы и выполнять пользовательскую логику на различных этапах, таких как отправка формы или преобразование данных.
👍3👾1
Чем PDO::FETCH_ASSOC отличается от PDO::FETCH_OBJ на низком уровне?

​В PDO существуют различные режимы выборки данных, определяемые константами, такими как PDO::FETCH_ASSOC и PDO::FETCH_OBJ. Они влияют на то, в каком формате будет возвращена строка из результирующего набора при выполнении запроса.​


PDO::FETCH_ASSOC: При использовании этого режима каждая строка возвращается в виде ассоциативного массива, где ключами являются названия столбцов. Это позволяет обращаться к значениям столбцов по их именам.

PDO::FETCH_OBJ: В этом режиме каждая строка возвращается как объект анонимного класса, где свойства соответствуют названиям столбцов. Доступ к данным осуществляется через свойства объекта.

Низкоуровневые различия:

На низком уровне основное различие между этими режимами заключается в типе возвращаемой структуры данных:​

🔸 PDO::FETCH_ASSOC: возвращает ассоциативный массив (array), где ключами являются строки (имена столбцов), а значениями — соответствующие данные.​
Habr

🔸 PDO::FETCH_OBJ: возвращает объект (object) стандартного класса (stdClass), где свойства объекта соответствуют именам столбцов.​

Выбор между этими режимами зависит от предпочтений разработчика и специфики задачи. Если удобнее работать с массивами и использовать синтаксис $row['column_name'], то подойдет PDO::FETCH_ASSOC. Если предпочтительнее объектный доступ через $row->column_name, то стоит использовать PDO::FETCH_OBJ.​

Важно отметить, что при использовании PDO::FETCH_OBJ создается новый экземпляр объекта для каждой строки результирующего набора, что может потреблять больше памяти по сравнению с ассоциативными массивами. Однако это различие обычно незначительно и становится заметным только при обработке больших объемов данных.
👍5😁3🥱2
💬 Как оставлять комментарии в чате нашего канала

В нашем чате работает бот Shieldy — он защищает от спама, запрашивая у новых участников решение простой капчи.

⚠️ Проблема, с которой сталкиваются многие: вы нажимаете под постом «Прокомментировать», пишете что-то, а потом получаете бан и не можете писать комментарии.

Почему так: Shieldy отправляет капчу в сам чат, а не в комментарии под конкретный пост. Из-за этого капчу можно не увидеть, не отправить ответ на нее, и бот автоматически заблокирует вас.

Как присоединиться к чату, чтобы бот вас не забанил

— Зайдите в описание канала с телефона и нажмите кнопку Discuss / Чат
— Нажмите Join / Присоединиться
— Сразу обратите внимание на сообщение от бота Shieldy
— Решите простой пример и отправьте ответ в чат

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

❗️ Если вас все-таки забанили

— Это временная блокировка на несколько минут
— Подождите и попробуйте зайти позже, бот снова отправит вам капчу

Админы канала никак не могут ускорить процесс, бот автоматически снимает с вас блокировку через пару минут. Мы понимаем, что эта система неидеальна, и ищем более удобное решение.

👾 Спасибо, что активно участвуете в обсуждении наших постов!
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚2
Как хранятся данные в redis / memcached?

В Redis данные хранятся в оперативной памяти, что обеспечивает высокую скорость доступа к данным. Redis использует структуру данных, называемую ключ-значение (key-value). Каждое значение хранится под уникальным ключом, который позволяет быстро найти и получить доступ к этим данным.

Redis поддерживает различные типы данных, включая строки, списки, множества, сортированные множества (sorted sets) и хэши. Например, для хранения строки в Redis можно использовать команду SET, где ключ — это уникальное имя, а значение — сама строка. По ключу можно получить или изменить значение, используя команду GET или SET соответственно.

Memcached также использует ключ-значение для хранения данных. Memcached не поддерживает различные типы данных, он хранит все данные как массивы байтов. Обращение к данным в Memcached происходит с использованием ключа и команд get и set, похожих на Redis.

Оба этих инструмента являются ин-memory кешами, которые используются для ускорения доступа к данным, предоставляя быструю запись или чтение из оперативной памяти, минуя долгие операции чтения или записи на диск. При этом данные в Redis и Memcached не являются постоянными, поскольку они хранятся только в памяти компьютера, а не на диске. Они предназначены для хранения временных данных или данных, к которым часто обращаются.
👍4
Что такое Attributes в PHP 8 и когда их использовать?

PHP 8 представил атрибуты — мощный инструмент для добавления структурированных метаданных к вашему коду. Теперь вы можете аннотировать классы, методы и свойства без использования phpDoc-комментариев. Это делает код более чистым и читаемым.​

В нашем примере атрибут Route определяет маршрут для метода listUsers, делая код более декларативным и понятным.​

Когда использовать атрибуты?

Фреймворки и библиотеки: Многие современные фреймворки, такие как Symfony или Laravel, используют атрибуты для конфигурации маршрутов, привязки зависимостей и других аспектов, что упрощает настройку и делает код более читаемым.​

ORM (Object-Relational Mapping): Атрибуты могут использоваться для определения маппинга между классами и таблицами базы данных, заменяя устаревшие комментарии-аннотации. Это улучшает производительность и упрощает поддержку кода. ​

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

Преимущества атрибутов:

🔸 Структурированность: Атрибуты обеспечивают строгий синтаксис для метаданных, что упрощает их обработку и снижает вероятность ошибок.​

🔸Производительность: В отличие от phpDoc, атрибуты обрабатываются на уровне языка, что может положительно сказываться на производительности приложения.​

🔸 Интеграция: Атрибуты легко интегрируются с рефлексией, позволяя динамически получать информацию о метаданных и адаптировать поведение приложения.
👍10
Как использовать Eager loading в Laravel?

Eager loading в Laravel — это способ предварительной загрузки связанных моделей, чтобы уменьшить количество запросов к базе данных и повысить производительность приложения. При использовании ленивой загрузки (lazy loading) связанные данные загружаются только тогда, когда к ним обращаются, что может привести к множественным запросам к базе данных (проблема N+1 запросов). В то время как eager loading загружает все необходимые данные заранее, используя объединение (join) или отдельные запросы с использованием ключевого слова with.

Eager loading помогает значительно снизить нагрузку на базу данных и ускорить работу приложения за счет уменьшения количества выполняемых запросов.
👍4
Что такое traits?

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

Также traits позволяют разделить функционал, что упрощает структуру кода и делает его более логичным и понятным.

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

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

Так как каждый класс может реализовать множество трейтов, могут возникать конфликты когда один и тот же метод реализован в разных трейтах и/или самом классе. Подробней о трейтах в документации.
5👾1
Что делает функция create_function(), и почему её не стоит использовать?

​Функция create_function() в PHP позволяет динамически создавать анонимные функции из переданных строковых параметров, возвращая уникальное имя созданной функции. Однако начиная с версии PHP 7.2.0, эта функция была объявлена устаревшей, а в PHP 8.0.0 полностью удалена. ​


Почему не рекомендуется использовать create_function():

🔸 Проблемы безопасности: create_function() использует внутри себя функцию eval(), что может привести к выполнению произвольного кода, если входные данные не проверяются должным образом. Это открывает потенциальные уязвимости для внедрения вредоносного кода. ​

🔸 Низкая производительность и утечки памяти: Функции, созданные с помощью create_function(), являются глобальными и не могут быть освобождены, что может привести к повышенному потреблению памяти и снижению производительности. ​

🔸 Устаревание и удаление: Из-за вышеупомянутых проблем, начиная с PHP 7.2.0, функция create_function() была объявлена устаревшей, а в PHP 8.0.0 полностью удалена. Это означает, что её использование в современном коде приведёт к ошибкам. ​

Рекомендуемая альтернатива:

Вместо create_function() следует использовать анонимные функции или замыкания, которые были введены в PHP 5.3 и обеспечивают более безопасный и эффективный способ создания функций на лету. ​
Каковы основные компоненты 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 обеспечивает соблюдение правил проверки объектов.
👍4🔥1
Что такое фильтр Блума?

Фильтр Блума — это вероятностная структура данных, которая используется для тестирования принадлежности элемента множеству. Он может давать ложные положительные результаты, но никогда не дает ложных отрицательных. Это значит, что если фильтр Блума говорит, что элемент принадлежит множеству, это может быть не так (ложное срабатывание), но если фильтр говорит, что элемент не принадлежит множеству, это точно так.

Подробнее в статье