В нашем чате работает бот Shieldy — он защищает от спама, запрашивая у новых участников решение простой капчи.
⚠️ Проблема, с которой сталкиваются многие: вы нажимаете под постом «Прокомментировать», пишете что-то, а потом получаете бан и не можете писать комментарии.
❓Почему так: Shieldy отправляет капчу в сам чат, а не в комментарии под конкретный пост. Из-за этого капчу можно не увидеть, не отправить ответ на нее, и бот автоматически заблокирует вас.
— Зайдите в описание канала с телефона и нажмите кнопку Discuss / Чат
— Нажмите Join / Присоединиться
— Сразу обратите внимание на сообщение от бота Shieldy
— Решите простой пример и отправьте ответ в чат
После этого бот отправит приветственное сообщение и вы сможете оставлять комментарии. Эту проверку нужно пройти только один раз при вступлении в чат.
❗️ Если вас все-таки забанили
— Это временная блокировка на несколько минут
— Подождите и попробуйте зайти позже, бот снова отправит вам капчу
Админы канала никак не могут ускорить процесс, бот автоматически снимает с вас блокировку через пару минут. Мы понимаем, что эта система неидеальна, и ищем более удобное решение.
👾 Спасибо, что активно участвуете в обсуждении наших постов!
Please open Telegram to view this post
VIEW IN TELEGRAM
Как хранятся данные в redis / memcached?
В Redis данные хранятся в оперативной памяти, что обеспечивает высокую скорость доступа к данным. Redis использует структуру данных, называемую ключ-значение (key-value). Каждое значение хранится под уникальным ключом, который позволяет быстро найти и получить доступ к этим данным.
Redis поддерживает различные типы данных, включая строки, списки, множества, сортированные множества (sorted sets) и хэши. Например, для хранения строки в Redis можно использовать команду SET, где ключ — это уникальное имя, а значение — сама строка. По ключу можно получить или изменить значение, используя команду GET или SET соответственно.
Memcached также использует ключ-значение для хранения данных. Memcached не поддерживает различные типы данных, он хранит все данные как массивы байтов. Обращение к данным в Memcached происходит с использованием ключа и команд get и set, похожих на Redis.
Оба этих инструмента являются ин-memory кешами, которые используются для ускорения доступа к данным, предоставляя быструю запись или чтение из оперативной памяти, минуя долгие операции чтения или записи на диск. При этом данные в Redis и Memcached не являются постоянными, поскольку они хранятся только в памяти компьютера, а не на диске. Они предназначены для хранения временных данных или данных, к которым часто обращаются.
В Redis данные хранятся в оперативной памяти, что обеспечивает высокую скорость доступа к данным. Redis использует структуру данных, называемую ключ-значение (key-value). Каждое значение хранится под уникальным ключом, который позволяет быстро найти и получить доступ к этим данным.
Redis поддерживает различные типы данных, включая строки, списки, множества, сортированные множества (sorted sets) и хэши. Например, для хранения строки в Redis можно использовать команду SET, где ключ — это уникальное имя, а значение — сама строка. По ключу можно получить или изменить значение, используя команду GET или SET соответственно.
Memcached также использует ключ-значение для хранения данных. Memcached не поддерживает различные типы данных, он хранит все данные как массивы байтов. Обращение к данным в Memcached происходит с использованием ключа и команд get и set, похожих на Redis.
Оба этих инструмента являются ин-memory кешами, которые используются для ускорения доступа к данным, предоставляя быструю запись или чтение из оперативной памяти, минуя долгие операции чтения или записи на диск. При этом данные в Redis и Memcached не являются постоянными, поскольку они хранятся только в памяти компьютера, а не на диске. Они предназначены для хранения временных данных или данных, к которым часто обращаются.
Что такое Attributes в PHP 8 и когда их использовать?
PHP 8 представил атрибуты — мощный инструмент для добавления структурированных метаданных к вашему коду. Теперь вы можете аннотировать классы, методы и свойства без использования phpDoc-комментариев. Это делает код более чистым и читаемым.
В нашем примере атрибут
Когда использовать атрибуты?
Фреймворки и библиотеки: Многие современные фреймворки, такие как Symfony или Laravel, используют атрибуты для конфигурации маршрутов, привязки зависимостей и других аспектов, что упрощает настройку и делает код более читаемым.
ORM (Object-Relational Mapping): Атрибуты могут использоваться для определения маппинга между классами и таблицами базы данных, заменяя устаревшие комментарии-аннотации. Это улучшает производительность и упрощает поддержку кода.
Валидация и сериализация: Атрибуты позволяют задавать правила валидации или определять, как свойства класса должны сериализоваться, что делает код более декларативным и понятным.
Преимущества атрибутов:
🔸 Структурированность: Атрибуты обеспечивают строгий синтаксис для метаданных, что упрощает их обработку и снижает вероятность ошибок.
🔸Производительность: В отличие от phpDoc, атрибуты обрабатываются на уровне языка, что может положительно сказываться на производительности приложения.
🔸 Интеграция: Атрибуты легко интегрируются с рефлексией, позволяя динамически получать информацию о метаданных и адаптировать поведение приложения.
PHP 8 представил атрибуты — мощный инструмент для добавления структурированных метаданных к вашему коду. Теперь вы можете аннотировать классы, методы и свойства без использования phpDoc-комментариев. Это делает код более чистым и читаемым.
В нашем примере атрибут
Route
определяет маршрут для метода listUsers
, делая код более декларативным и понятным.Когда использовать атрибуты?
Фреймворки и библиотеки: Многие современные фреймворки, такие как Symfony или Laravel, используют атрибуты для конфигурации маршрутов, привязки зависимостей и других аспектов, что упрощает настройку и делает код более читаемым.
ORM (Object-Relational Mapping): Атрибуты могут использоваться для определения маппинга между классами и таблицами базы данных, заменяя устаревшие комментарии-аннотации. Это улучшает производительность и упрощает поддержку кода.
Валидация и сериализация: Атрибуты позволяют задавать правила валидации или определять, как свойства класса должны сериализоваться, что делает код более декларативным и понятным.
Преимущества атрибутов:
🔸 Структурированность: Атрибуты обеспечивают строгий синтаксис для метаданных, что упрощает их обработку и снижает вероятность ошибок.
🔸Производительность: В отличие от phpDoc, атрибуты обрабатываются на уровне языка, что может положительно сказываться на производительности приложения.
🔸 Интеграция: Атрибуты легко интегрируются с рефлексией, позволяя динамически получать информацию о метаданных и адаптировать поведение приложения.
Как использовать Eager loading в Laravel?
Eager loading в Laravel — это способ предварительной загрузки связанных моделей, чтобы уменьшить количество запросов к базе данных и повысить производительность приложения. При использовании ленивой загрузки (lazy loading) связанные данные загружаются только тогда, когда к ним обращаются, что может привести к множественным запросам к базе данных (проблема N+1 запросов). В то время как eager loading загружает все необходимые данные заранее, используя объединение (join) или отдельные запросы с использованием ключевого слова with.
Eager loading помогает значительно снизить нагрузку на базу данных и ускорить работу приложения за счет уменьшения количества выполняемых запросов.
Eager loading в Laravel — это способ предварительной загрузки связанных моделей, чтобы уменьшить количество запросов к базе данных и повысить производительность приложения. При использовании ленивой загрузки (lazy loading) связанные данные загружаются только тогда, когда к ним обращаются, что может привести к множественным запросам к базе данных (проблема N+1 запросов). В то время как eager loading загружает все необходимые данные заранее, используя объединение (join) или отдельные запросы с использованием ключевого слова with.
Eager loading помогает значительно снизить нагрузку на базу данных и ускорить работу приложения за счет уменьшения количества выполняемых запросов.
Что такое traits?
Traits в PHP — это механизм, который позволяет повторно использовать код в классах без необходимости использования множественного наследования. Traits предоставляют решение для проблемы, когда несколько классов должны иметь одинаковый функционал, но наследование не является подходящим вариантом.
Также traits позволяют разделить функционал, что упрощает структуру кода и делает его более логичным и понятным.
Альтернативным решением для использования функционала traits может быть использование интерфейсов. Однако интерфейсы требуют реализации всех методов, которые определены в интерфейсе, в классе, в то время как трейты могут предоставлять реализацию функционала по умолчанию.
Оба варианта имеют свои преимущества, но трейты в PHP предоставляют большую гибкость при повторном использовании кода в разных классах.
Так как каждый класс может реализовать множество трейтов, могут возникать конфликты когда один и тот же метод реализован в разных трейтах и/или самом классе. Подробней о трейтах в документации.
Traits в PHP — это механизм, который позволяет повторно использовать код в классах без необходимости использования множественного наследования. Traits предоставляют решение для проблемы, когда несколько классов должны иметь одинаковый функционал, но наследование не является подходящим вариантом.
Также traits позволяют разделить функционал, что упрощает структуру кода и делает его более логичным и понятным.
Альтернативным решением для использования функционала traits может быть использование интерфейсов. Однако интерфейсы требуют реализации всех методов, которые определены в интерфейсе, в классе, в то время как трейты могут предоставлять реализацию функционала по умолчанию.
Оба варианта имеют свои преимущества, но трейты в PHP предоставляют большую гибкость при повторном использовании кода в разных классах.
Так как каждый класс может реализовать множество трейтов, могут возникать конфликты когда один и тот же метод реализован в разных трейтах и/или самом классе. Подробней о трейтах в документации.
Что делает функция create_function(), и почему её не стоит использовать?
Функция
Почему не рекомендуется использовать create_function():
🔸 Проблемы безопасности:
🔸 Низкая производительность и утечки памяти: Функции, созданные с помощью create_function(), являются глобальными и не могут быть освобождены, что может привести к повышенному потреблению памяти и снижению производительности.
🔸 Устаревание и удаление: Из-за вышеупомянутых проблем, начиная с PHP 7.2.0, функция create_function() была объявлена устаревшей, а в PHP 8.0.0 полностью удалена. Это означает, что её использование в современном коде приведёт к ошибкам.
Рекомендуемая альтернатива:
Вместо
Функция
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 для отправки нескольких событий во время обработки запроса, что позволяет внедрять пользовательское поведение в различных точках. Например, он отправляет событие '
Компонент Twig — это шаблонизатор Symfony, взаимодействующий с HttpKernel для рендеринга представлений. Doctrine ORM взаимодействует с базой данных, обеспечивая персистентность данных.
Security обеспечивает аутентификацию и авторизацию, тесно взаимодействуя с HttpKernel и EventDispatcher. Translation помогает в интернационализации, а Validator обеспечивает соблюдение правил проверки объектов.
Symfony состоит из нескольких ключевых компонентов, которые взаимодействуют между собой, создавая надежный PHP-фреймворк. Компонент HttpFoundation заменяет глобальные переменные PHP объектно-ориентированным слоем, что позволяет проще работать с HTTP-запросами и ответами. Routing управляет генерацией и подбором URL, а EventDispatcher позволяет разделить код с помощью слушателей событий. DependencyInjection обеспечивает функциональность контейнера сервисов, способствуя многократному использованию и тестированию кода.
HttpKernel выступает в качестве ядра, используя другие компоненты для обработки запросов и генерации ответов. Он использует EventDispatcher для отправки нескольких событий во время обработки запроса, что позволяет внедрять пользовательское поведение в различных точках. Например, он отправляет событие '
kernel.request
', которое может быть использовано Routing для сопоставления запроса с маршрутом и определения контроллера.Компонент Twig — это шаблонизатор Symfony, взаимодействующий с HttpKernel для рендеринга представлений. Doctrine ORM взаимодействует с базой данных, обеспечивая персистентность данных.
Security обеспечивает аутентификацию и авторизацию, тесно взаимодействуя с HttpKernel и EventDispatcher. Translation помогает в интернационализации, а Validator обеспечивает соблюдение правил проверки объектов.
Что такое фильтр Блума?
Фильтр Блума — это вероятностная структура данных, которая используется для тестирования принадлежности элемента множеству. Он может давать ложные положительные результаты, но никогда не дает ложных отрицательных. Это значит, что если фильтр Блума говорит, что элемент принадлежит множеству, это может быть не так (ложное срабатывание), но если фильтр говорит, что элемент не принадлежит множеству, это точно так.
Подробнее в статье
Фильтр Блума — это вероятностная структура данных, которая используется для тестирования принадлежности элемента множеству. Он может давать ложные положительные результаты, но никогда не дает ложных отрицательных. Это значит, что если фильтр Блума говорит, что элемент принадлежит множеству, это может быть не так (ложное срабатывание), но если фильтр говорит, что элемент не принадлежит множеству, это точно так.
Подробнее в статье
Как использовать «PHPUnit» для написания модульных тестов для PHP-приложений, и каковы лучшие практики для этого?
PHPUnit — это широко используемый фреймворк для написания модульных тестов в PHP. Он позволяет разработчикам писать тестовые примеры, чтобы убедиться, что отдельные части кода работают так, как ожидается.
Для запуска тестов можно использовать команду
PHPUnit — это широко используемый фреймворк для написания модульных тестов в PHP. Он позволяет разработчикам писать тестовые примеры, чтобы убедиться, что отдельные части кода работают так, как ожидается.
Для запуска тестов можно использовать команду
phpunit
. Лучшие практики модульного тестирования включают в себя написание независимых, повторяемых и легко поддерживаемых тестов, использование фикстур для создания тестовых данных, а также тестирование как положительных, так и отрицательных случаев.❗️Даже опытные PHP-разработчики сталкиваются с выбором: богатая или анемичная модель? CQRS или Event Sourcing? REST API или что-то сложнее?
- узнаете, как упростить разработку с помощью грамотно выстроенной архитектуры
- научитесь осознанно выбирать инструмент под задачу
- посмотрите на полезные практические приёмы
Превратите архитектуру в своё конкурентное преимущество. Освойте подходы, которые реально работают в "бою" — и стань увереннее в любом проекте, от MVP до highload.
Приходите на открытый урок 8 апреля в 20:00 мск. Участники получат скидку на курс «PHP Developer. Professional».
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, Erid 2Vtzqvk4sBv
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между include, require, include_once и require_once на уровне производительности?
В PHP конструкции
Обзор конструкций:
include: Включает указанный файл. Если файл не найден, генерируется предупреждение (E_WARNING), и выполнение скрипта продолжается.
require: Аналогично include, но при отсутствии файла вызывает фатальную ошибку (E_COMPILE_ERROR), останавливая выполнение скрипта.
include_once: Действует как include, но проверяет, был ли файл уже включен ранее; если да, повторное включение не происходит.
require_once: Работает аналогично require, с дополнительной проверкой на предыдущее включение файла, предотвращая повторное его подключение.
Различия в производительности:
При однократном включении файлов различия в производительности между этими конструкциями незначительны и практически незаметны. Однако при многократном включении одного и того же файла в рамках одного запроса могут возникнуть некоторые отличия:
Практические рекомендации:
🔸 Используйте
🔸 Для менее критичных файлов можно использовать
🔸 Избегайте многократного включения одного и того же файла в рамках одного запроса без необходимости, чтобы минимизировать накладные расходы и потенциальные ошибки.
В PHP конструкции
include
, require
, include_once
и require_once
используются для включения содержимого одного файла в другой. Основные различия между ними связаны с обработкой ошибок и повторным включением файлов. С точки зрения производительности различия минимальны, но некоторые нюансы стоит учитывать.Обзор конструкций:
include: Включает указанный файл. Если файл не найден, генерируется предупреждение (E_WARNING), и выполнение скрипта продолжается.
require: Аналогично include, но при отсутствии файла вызывает фатальную ошибку (E_COMPILE_ERROR), останавливая выполнение скрипта.
include_once: Действует как include, но проверяет, был ли файл уже включен ранее; если да, повторное включение не происходит.
require_once: Работает аналогично require, с дополнительной проверкой на предыдущее включение файла, предотвращая повторное его подключение.
Различия в производительности:
При однократном включении файлов различия в производительности между этими конструкциями незначительны и практически незаметны. Однако при многократном включении одного и того же файла в рамках одного запроса могут возникнуть некоторые отличия:
include
и require
: Каждый раз при вызове происходит повторное включение и выполнение кода из указанного файла, что может привести к избыточным операциям и увеличению времени выполнения, особенно если файл содержит ресурсоемкий код.include_once
и require_once
: Перед включением файла проверяют, был ли он уже подключен ранее. Эта проверка требует дополнительных ресурсов, но предотвращает повторное выполнение кода из одного и того же файла, что может быть полезно для избежания ошибок, связанных с повторным объявлением функций, классов или переменных.Практические рекомендации:
🔸 Используйте
require_once
для подключения файлов, содержащих критически важный код (например, конфигурационные файлы или определения классов), чтобы гарантировать их однократное включение и избежать фатальных ошибок при их отсутствии.🔸 Для менее критичных файлов можно использовать
include
или include_once
, в зависимости от необходимости проверки на повторное включение.🔸 Избегайте многократного включения одного и того же файла в рамках одного запроса без необходимости, чтобы минимизировать накладные расходы и потенциальные ошибки.
Что такое JIT? Как он работает?
JIT (Just-In-Time) компиляция представляет собой метод оптимизации выполнения кода, при котором код не компилируется заранее в процессе разработки, а только перед фактическим его выполнением во время работы программы. Это позволяет улучшить производительность программы за счет оптимизаций, которые могут быть применены с учетом конкретных условий выполнения.
Как это работает:
Исходный код на PHP: Начинаем с написания нашего кода на PHP, который является языком сценариев с динамической типизацией.
Компиляция в промежуточный код (opcode): Исходный код PHP компилируется в промежуточный байт-код, который представляет собой некий промежуточный представитель нашего кода, близкий к машинному коду, но все еще независимый от конкретной аппаратной платформы.
Исполнение байт-кода: Этот байт-код может быть интерпретирован непосредственно виртуальной машиной PHP (Zend VM), что происходит по умолчанию. Однако, в контексте JIT, в определенный момент, когда интерпретатор PHP обнаруживает, что некий участок кода используется достаточно часто, он может решить скомпилировать этот участок кода в машинный код «на лету».
JIT-компиляция: В процессе выполнения программы JIT-компилятор анализирует и оптимизирует участки кода, которые часто выполняются. Это позволяет улучшить производительность, так как оптимизации адаптированы к конкретному исполняющемуся коду и платформе.
Выполнение оптимизированного кода: После JIT-компиляции оптимизированный машинный код заменяет соответствующий участок байт-кода, что может значительно ускорить выполнение программы.
Этот подход позволяет более эффективно использовать ресурсы и достигнуть лучшей производительности в сравнении с чистым интерпретатором.
JIT (Just-In-Time) компиляция представляет собой метод оптимизации выполнения кода, при котором код не компилируется заранее в процессе разработки, а только перед фактическим его выполнением во время работы программы. Это позволяет улучшить производительность программы за счет оптимизаций, которые могут быть применены с учетом конкретных условий выполнения.
Как это работает:
Исходный код на PHP: Начинаем с написания нашего кода на PHP, который является языком сценариев с динамической типизацией.
Компиляция в промежуточный код (opcode): Исходный код PHP компилируется в промежуточный байт-код, который представляет собой некий промежуточный представитель нашего кода, близкий к машинному коду, но все еще независимый от конкретной аппаратной платформы.
Исполнение байт-кода: Этот байт-код может быть интерпретирован непосредственно виртуальной машиной PHP (Zend VM), что происходит по умолчанию. Однако, в контексте JIT, в определенный момент, когда интерпретатор PHP обнаруживает, что некий участок кода используется достаточно часто, он может решить скомпилировать этот участок кода в машинный код «на лету».
JIT-компиляция: В процессе выполнения программы JIT-компилятор анализирует и оптимизирует участки кода, которые часто выполняются. Это позволяет улучшить производительность, так как оптимизации адаптированы к конкретному исполняющемуся коду и платформе.
Выполнение оптимизированного кода: После JIT-компиляции оптимизированный машинный код заменяет соответствующий участок байт-кода, что может значительно ускорить выполнение программы.
Этот подход позволяет более эффективно использовать ресурсы и достигнуть лучшей производительности в сравнении с чистым интерпретатором.