Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Полный курс PHP для начинающих и продвинутых
Full PHP 8 Tutorial
How To Install PHP & What Are Web Servers
Basic PHP Syntax
What Are Constants & Variable Variables In PHP
PHP Data Types - Typecasting Overview & How It Works
PHP Boolean Data Type
PHP Integer Data type
PHP Float Data Type
PHP String Data Type - Heredoc & Nowdoc Syntax
PHP Null Data Type
На данный момент доступно 139 видео
Full PHP 8 Tutorial
How To Install PHP & What Are Web Servers
Basic PHP Syntax
What Are Constants & Variable Variables In PHP
PHP Data Types - Typecasting Overview & How It Works
PHP Boolean Data Type
PHP Integer Data type
PHP Float Data Type
PHP String Data Type - Heredoc & Nowdoc Syntax
PHP Null Data Type
На данный момент доступно 139 видео
Какие есть типы индексов в бд?
Использование индексов в базах данных подразумевает их создание, просмотр и удаление для оптимизации запросов. Индексы ускоряют операции чтения (SELECT), но могут замедлить операции записи (INSERT, UPDATE, DELETE).
Общий синтаксис создания индекса выглядит следующим образом:
Вот основные типы индексов:
1. Кластерные индексы (Clustered Index)
🔸 Упорядочивают данные в таблице в соответствии с индексом.
🔸 Каждая таблица может иметь только один кластерный индекс, так как физический порядок строк определяется им.
🔸 Пример: Первичный ключ часто создается как кластерный индекс.
Преимущества:
🔹 Быстрый доступ к данным в диапазонных запросах.
🔹 Эффективно при выборке упорядоченных данных.
Недостатки:
🔹 Медленные операции вставки, обновления и удаления, так как данные переносятся для сохранения порядка.
2. Некластерные индексы (Non-Clustered Index)
🔸 Содержат указатели на фактические строки данных.
🔸 Таблица может иметь несколько некластерных индексов.
🔸 Пример: Индексация столбца, который часто используется в условиях WHERE.
Преимущества:
🔹 Быстрый доступ к конкретным значениям.
🔹 Может использоваться для оптимизации запросов с различными столбцами.
Недостатки:
🔹 Дополнительное использование дискового пространства.
🔹 Замедление операций вставки, обновления и удаления.
3. Уникальные индексы (Unique Index)
🔸 Обеспечивают уникальность значений в одном или нескольких столбцах.
🔸 Пример: Индекс на email-адрес в таблице пользователей.
Преимущества:
🔹 Поддерживает целостность данных.
🔹 Повышает производительность запросов.
Недостатки:
🔹 Невозможно хранить дублирующиеся значения.
4. Составные индексы (Composite Index)
🔸 Создаются на основе нескольких столбцов.
🔸 Пример: Индекс на столбцы (lastname, firstname).
Преимущества:
🔹 Улучшает производительность запросов, где используются все или часть индекса.
Недостатки:
🔹 Требует внимательного проектирования, чтобы учитывать порядок столбцов.
5. Полнотекстовые индексы (Full-Text Index)
🔸 Используются для поиска текстовых данных, таких как документы или длинные текстовые поля.
🔸 Пример: Полнотекстовый поиск по колонке description в таблице товаров.
Преимущества:
🔹 Оптимизирован для поиска ключевых слов или фраз.
Недостатки:
🔹 Поддерживается не всеми СУБД.
🔹 Может занимать значительное место.
6. Битмап-индексы (Bitmap Index)
🔸 Представляют данные в виде битовых карт.
🔸 Чаще всего используются в столбцах с низкой кардинальностью (небольшим количеством уникальных значений).
Преимущества:
🔹 Эффективны для аналитических запросов и запросов с большими объемами данных.
Недостатки:
🔹 Не подходят для таблиц с частыми изменениями данных.
7. XML/JSON Индексы
🔸 Оптимизируют поиск в данных, хранящихся в XML или JSON-форматах.
Преимущества:
🔹 Ускоряют сложные запросы по вложенным структурам.
Недостатки:
🔹 Занимают дополнительное пространство.
🔹 Ограниченная поддержка в некоторых СУБД.
8. Пространственные индексы (Spatial Index)
🔸 Используются для работы с географическими и пространственными данными.
🔸 Пример: Индексация координат в базе данных геоинформационных систем.
Преимущества:
🔹 Эффективны для запросов, связанных с расстояниями, полигонами и геометрией.
9. Хэш-индексы (Hash Index)
🔸 Используют хэш-функции для индексирования данных.
🔸 Пример: Подходит для равенства (например, WHERE column = value).
Преимущества:
🔹 Очень быстрые запросы на точное совпадение.
Недостатки:
🔹 Не поддерживают диапазонные запросы.
Использование индексов в базах данных подразумевает их создание, просмотр и удаление для оптимизации запросов. Индексы ускоряют операции чтения (SELECT), но могут замедлить операции записи (INSERT, UPDATE, DELETE).
Общий синтаксис создания индекса выглядит следующим образом:
CREATE INDEX имя_индексаON имя_таблицы (столбец1 [ASC|DESC], столбец2 [ASC|DESC]);
Вот основные типы индексов:
1. Кластерные индексы (Clustered Index)
🔸 Упорядочивают данные в таблице в соответствии с индексом.
🔸 Каждая таблица может иметь только один кластерный индекс, так как физический порядок строк определяется им.
🔸 Пример: Первичный ключ часто создается как кластерный индекс.
Преимущества:
🔹 Быстрый доступ к данным в диапазонных запросах.
🔹 Эффективно при выборке упорядоченных данных.
Недостатки:
🔹 Медленные операции вставки, обновления и удаления, так как данные переносятся для сохранения порядка.
2. Некластерные индексы (Non-Clustered Index)
🔸 Содержат указатели на фактические строки данных.
🔸 Таблица может иметь несколько некластерных индексов.
🔸 Пример: Индексация столбца, который часто используется в условиях WHERE.
Преимущества:
🔹 Быстрый доступ к конкретным значениям.
🔹 Может использоваться для оптимизации запросов с различными столбцами.
Недостатки:
🔹 Дополнительное использование дискового пространства.
🔹 Замедление операций вставки, обновления и удаления.
3. Уникальные индексы (Unique Index)
🔸 Обеспечивают уникальность значений в одном или нескольких столбцах.
🔸 Пример: Индекс на email-адрес в таблице пользователей.
Преимущества:
🔹 Поддерживает целостность данных.
🔹 Повышает производительность запросов.
Недостатки:
🔹 Невозможно хранить дублирующиеся значения.
4. Составные индексы (Composite Index)
🔸 Создаются на основе нескольких столбцов.
🔸 Пример: Индекс на столбцы (lastname, firstname).
Преимущества:
🔹 Улучшает производительность запросов, где используются все или часть индекса.
Недостатки:
🔹 Требует внимательного проектирования, чтобы учитывать порядок столбцов.
5. Полнотекстовые индексы (Full-Text Index)
🔸 Используются для поиска текстовых данных, таких как документы или длинные текстовые поля.
🔸 Пример: Полнотекстовый поиск по колонке description в таблице товаров.
Преимущества:
🔹 Оптимизирован для поиска ключевых слов или фраз.
Недостатки:
🔹 Поддерживается не всеми СУБД.
🔹 Может занимать значительное место.
6. Битмап-индексы (Bitmap Index)
🔸 Представляют данные в виде битовых карт.
🔸 Чаще всего используются в столбцах с низкой кардинальностью (небольшим количеством уникальных значений).
Преимущества:
🔹 Эффективны для аналитических запросов и запросов с большими объемами данных.
Недостатки:
🔹 Не подходят для таблиц с частыми изменениями данных.
7. XML/JSON Индексы
🔸 Оптимизируют поиск в данных, хранящихся в XML или JSON-форматах.
Преимущества:
🔹 Ускоряют сложные запросы по вложенным структурам.
Недостатки:
🔹 Занимают дополнительное пространство.
🔹 Ограниченная поддержка в некоторых СУБД.
8. Пространственные индексы (Spatial Index)
🔸 Используются для работы с географическими и пространственными данными.
🔸 Пример: Индексация координат в базе данных геоинформационных систем.
Преимущества:
🔹 Эффективны для запросов, связанных с расстояниями, полигонами и геометрией.
9. Хэш-индексы (Hash Index)
🔸 Используют хэш-функции для индексирования данных.
🔸 Пример: Подходит для равенства (например, WHERE column = value).
Преимущества:
🔹 Очень быстрые запросы на точное совпадение.
Недостатки:
🔹 Не поддерживают диапазонные запросы.
🛠️Использование Laravel Tinker в Chrome DevTools
Статья о том, как интегрировать Laravel Tinker с Chrome DevTools для более удобной отладки и тестирования кода прямо в браузере.
Это позволяет быстрее проверять и экспериментировать с кодом Laravel, используя привычные инструменты Chrome.
https://www.amitmerchant.com/laravel-tinker-chrome-devtools/
Статья о том, как интегрировать Laravel Tinker с Chrome DevTools для более удобной отладки и тестирования кода прямо в браузере.
Это позволяет быстрее проверять и экспериментировать с кодом Laravel, используя привычные инструменты Chrome.
https://www.amitmerchant.com/laravel-tinker-chrome-devtools/
This media is not supported in your browser
VIEW IN TELEGRAM
Совет по Laravel 💡
Один из моих любимых недокументированных советов, который я регулярно использую. Используйте "
Один из моих любимых недокументированных советов, который я регулярно использую. Используйте "
wasRecentlyCreated
", чтобы проверить, была ли модель создана или найдена в базе данных.Оптимизация SQL-запросов в PHP: избавляемся от тормозов! 🚀
Сегодня я покажу вам, как улучшить производительность SQL-запросов в PHP и избавиться от лишней нагрузки на базу данных.
1. Используйте подготовленные запросы
Не только защита от SQL-инъекций, но и кеширование запросов внутри СУБД!
Пример с PDO:
2. Выбирайте только нужные данные
Зачем вам
3. Индексы – ваши друзья
Проверяйте, есть ли индексы на полях, которые часто используются в
4. Избегайте N+1 запроса
Вместо 100 мелких запросов – один с
❌ Плохо (100 запросов в цикле!):
✅ Хорошо (один запрос):
5. Используйте кеширование
Храните частые запросы в Redis или Memcached, чтобы снизить нагрузку на базу.
Эти советы помогут вам ускорить ваш PHP-код, снизить нагрузку на базу данных и сделать сайт более отзывчивым.
Сегодня я покажу вам, как улучшить производительность SQL-запросов в PHP и избавиться от лишней нагрузки на базу данных.
1. Используйте подготовленные запросы
Не только защита от SQL-инъекций, но и кеширование запросов внутри СУБД!
Пример с PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
2. Выбирайте только нужные данные
Зачем вам
SELECT *
, если нужно только id
и name
? Выбирайте только нужные колонки!
$stmt = $pdo->query("SELECT id, name FROM users");
3. Индексы – ваши друзья
Проверяйте, есть ли индексы на полях, которые часто используются в
WHERE
и JOIN
. Без индексов база будет делать полный перебор строк!
CREATE INDEX idx_email ON users(email);
4. Избегайте N+1 запроса
Вместо 100 мелких запросов – один с
JOIN
. ❌ Плохо (100 запросов в цикле!):
foreach ($users as $user) {
$stmt = $pdo->prepare("SELECT * FROM orders WHERE user_id = ?");
$stmt->execute([$user['id']]);
$orders[$user['id']] = $stmt->fetchAll();
}
✅ Хорошо (один запрос):
$query = "SELECT users.id, users.name, orders.id as order_id
FROM users
LEFT JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($query);
$result = $stmt->fetchAll();
5. Используйте кеширование
Храните частые запросы в Redis или Memcached, чтобы снизить нагрузку на базу.
$cacheKey = "users_list";
$users = $redis->get($cacheKey);
if (!$users) {
$users = $pdo->query("SELECT id, name FROM users")->fetchAll();
$redis->setex($cacheKey, 3600, json_encode($users));
}
Эти советы помогут вам ускорить ваш PHP-код, снизить нагрузку на базу данных и сделать сайт более отзывчивым.
Неиспользуемые определения в статическом анализе Behat
Разработчик поделился опытом оптимизации работы с тестами Behat. Он заметил, что некоторые определения, используемые в сценариях тестирования, больше не применяются и могут быть удалены. Это позволяет уменьшить объем кода, который нужно поддерживать и обновлять. Однако стандартные инструменты Behat не позволяют автоматически находить такие неиспользуемые элементы.
Проблема
Определения для тестов в Behat задаются специальными аннотациями или атрибутами. Эти определения используются в сценариях тестирования, записанных в feature-файлах. Со временем, по мере изменения сценариев, некоторые определения могут остаться невостребованными, но разработчики часто не замечают этого из-за высокой нагрузки и сосредоточенности на основной работе.
Решение через статический анализ
Для выявления неиспользуемых определений был предложен инструмент статического анализа. Он выполняет следующие шаги:
🔸Сканирует PHP-файлы на наличие определений (аннотации и атрибуты).
🔸Выделяет точные совпадения, регулярные выражения и именованные маски.
🔸Сопоставляет их с содержимым feature-файлов.
Пример анализа:
🔹Найдено 1036 определений: 747 точных, 106 с регулярными выражениями, 181 с именованными масками.
🔹Обнаружены 2 неиспользуемых определения, которые можно удалить.
Инструмент для работы: Behastan
Для реализации этого подхода был создан инструмент Behastan, интегрированный в утилиту Rector Swiss Knife. Она поддерживает проекты вплоть до PHP 7.2 и проста в использовании:
1. Установите утилиту:
2. Запустите анализ:
Этот инструмент помогает поддерживать чистоту кода и предотвращает накопление ненужных определений. Подключив его к CI/CD, можно автоматизировать процесс и избежать ручных проверок.
Разработчик поделился опытом оптимизации работы с тестами Behat. Он заметил, что некоторые определения, используемые в сценариях тестирования, больше не применяются и могут быть удалены. Это позволяет уменьшить объем кода, который нужно поддерживать и обновлять. Однако стандартные инструменты Behat не позволяют автоматически находить такие неиспользуемые элементы.
Проблема
Определения для тестов в Behat задаются специальными аннотациями или атрибутами. Эти определения используются в сценариях тестирования, записанных в feature-файлах. Со временем, по мере изменения сценариев, некоторые определения могут остаться невостребованными, но разработчики часто не замечают этого из-за высокой нагрузки и сосредоточенности на основной работе.
Решение через статический анализ
Для выявления неиспользуемых определений был предложен инструмент статического анализа. Он выполняет следующие шаги:
🔸Сканирует PHP-файлы на наличие определений (аннотации и атрибуты).
🔸Выделяет точные совпадения, регулярные выражения и именованные маски.
🔸Сопоставляет их с содержимым feature-файлов.
Пример анализа:
🔹Найдено 1036 определений: 747 точных, 106 с регулярными выражениями, 181 с именованными масками.
🔹Обнаружены 2 неиспользуемых определения, которые можно удалить.
Инструмент для работы: Behastan
Для реализации этого подхода был создан инструмент Behastan, интегрированный в утилиту Rector Swiss Knife. Она поддерживает проекты вплоть до PHP 7.2 и проста в использовании:
1. Установите утилиту:
composer require rector/swiss-knife --dev
2. Запустите анализ:
vendor/bin/swiss-knife behastan tests
Этот инструмент помогает поддерживать чистоту кода и предотвращает накопление ненужных определений. Подключив его к CI/CD, можно автоматизировать процесс и избежать ручных проверок.
PhpLDAPadmin - это веб инструмент управления данными LDAP для системных администраторов. Он обычно известен и называется "PLA".
При этом, PLA создан с учетом соответствия RFC LDAP, что позволяет использовать его с любым сервером LDAP
📌 Github
При этом, PLA создан с учетом соответствия RFC LDAP, что позволяет использовать его с любым сервером LDAP
📌 Github
Как бороться с «загадочными» багами в PHP? 🤔
Сегодня хочу поговорить про одну из самых неприятных проблем в программировании — «загадочные» баги. Это те ошибки, которые возникают только в продакшене, исчезают при попытке дебага и доводят до нервного тика 😬.
🔍 Почему это происходит?
- Разные окружения — локально у вас PHP 8.2, а на сервере 7.4 (и вдруг
- Необработанные ошибки — ошибки скрыты
- Состояние кэша — в OpCache или APCu залипла старая версия кода.
- Гонки потоков — скрипты выполняются параллельно и вмешиваются друг в друга.
🛠 Как с этим бороться?
1️⃣ Выключить OpCache на тестовом сервере
Это позволит быстрее проверять изменения и исключить залипание кода.
2️⃣ Настроить логирование
Включите
3️⃣ Сравнить окружения
Используйте
4️⃣ Включить трассировку ошибок
Xdebug поможет отследить стек вызовов, а Laravel Telescope покажет внутренности запроса.
5️⃣ Повторить проблему на копии продакшена
Запустите код в Docker с конфигом продакшена или создайте staging-сервер.
6️⃣ Подключить мониторинг и алерты
Инструменты типа Sentry, Bugsnag или New Relic помогут ловить ошибки раньше, чем их заметят пользователи.
Сегодня хочу поговорить про одну из самых неприятных проблем в программировании — «загадочные» баги. Это те ошибки, которые возникают только в продакшене, исчезают при попытке дебага и доводят до нервного тика 😬.
🔍 Почему это происходит?
- Разные окружения — локально у вас PHP 8.2, а на сервере 7.4 (и вдруг
match
ломает весь код). - Необработанные ошибки — ошибки скрыты
@
, а логи молчат. - Состояние кэша — в OpCache или APCu залипла старая версия кода.
- Гонки потоков — скрипты выполняются параллельно и вмешиваются друг в друга.
🛠 Как с этим бороться?
1️⃣ Выключить OpCache на тестовом сервере
Это позволит быстрее проверять изменения и исключить залипание кода.
2️⃣ Настроить логирование
Включите
error_reporting(E_ALL)
и убедитесь, что display_errors=Off
, а log_errors=On
с путём к файлу логов. 3️⃣ Сравнить окружения
Используйте
phpinfo()
или php -m
для проверки версий PHP и установленных модулей. 4️⃣ Включить трассировку ошибок
Xdebug поможет отследить стек вызовов, а Laravel Telescope покажет внутренности запроса.
5️⃣ Повторить проблему на копии продакшена
Запустите код в Docker с конфигом продакшена или создайте staging-сервер.
6️⃣ Подключить мониторинг и алерты
Инструменты типа Sentry, Bugsnag или New Relic помогут ловить ошибки раньше, чем их заметят пользователи.
Highload буткемп: Системный дизайн, Производительность и Масштабирование
Приглашаем на курсы для прокачки навыков архитектора и проектировщика на весеннем highload-потоке от DevHands.
🌐 Приходите на уникальный образовательный трек без отрыва от работы (занятия вечером), в рамках которого вы:
🤩 изучите ключевые хайлоад-паттерны и получите навыки проектирования систем с миллионной аудиторией (балансировка, масштабирование, высокая доступность, шардинг, CAP/PACELS, транзакционные очереди и многое другое)
🤩 поупражняетесь в системном дизайне и проектировании, и получите живую обратную связь на реальных задачах: магазин/маркетплейс, объявления, соцсети, такси/доставка и тд.
🤩 погрузитесь в highload максимально, при желании в первый же день получите в управление свою инфраструктуру, попробуете “выжать” 100K RPS из своих сервисов, получите уникальный опыт работы с кластерными решениями - Redis, SPQR, CockroachDB
🤩 научитесь планировать нагрузку и связывать бизнес-показатели с нефункциональными требованиями к системе
🤩 попрактикуетесь в проведении и прохождения секций системного дизайна на интервью
Только «живые» онлайн-сессии: лекции, брейнштормы, презентации домашних проектов.
🗓 Старт потока 22 апреля, изучайте программу и записывайтесь:
🤩 Буткэмп “Производительность и масштабируемость” для тех, кто хочет поработать с собственной инфрой
🤩 Курс “Системный дизайн высоконагруженных проектов” для тех, кто хочет только практику проектирования “у доски”
🥸 Кто мы: R&D-центр Devhands, основатель школы и автор курса Алексей Рыбак, ex-СТО Badoo и Yum! Brands, с многолетним опытом высоконагруженных проектов и управления глобальными технологическими организациями, член программного комитета Highload.
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2Vtzqv8dwE1
Приглашаем на курсы для прокачки навыков архитектора и проектировщика на весеннем highload-потоке от DevHands.
Только «живые» онлайн-сессии: лекции, брейнштормы, презентации домашних проектов.
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2Vtzqv8dwE1
Please open Telegram to view this post
VIEW IN TELEGRAM
Taran — инструмент нагрузочного тестирования
Простой инструмент для нагрузочного тестирования веб-приложений.
Написан на PHP 8.1+ с использованием консольного фреймворка Laravel Zero.
🔗 GitHub
#библиотека
Простой инструмент для нагрузочного тестирования веб-приложений.
Написан на PHP 8.1+ с использованием консольного фреймворка Laravel Zero.
🔗 GitHub
#библиотека
GitHub
GitHub - maximal/taran: Web applications and servers benchmarking tool.
Web applications and servers benchmarking tool. Contribute to maximal/taran development by creating an account on GitHub.
⚡️ SQLAdmin — инструмент, превращающий ваши SQLAlchemy или SQLModel-модели в функциональный бэкенд-интерфейс за несколько минут.
Особенно в проекте радует поддержка как синхронных, так и асинхронных движков SQLAlchemy, что делает его универсальным выбором для современных проектов.
Интерфейс построен на Tabler — чистом и современном CSS-фреймворке, который не требует тонн JavaScript.
🤖 GitHub
Особенно в проекте радует поддержка как синхронных, так и асинхронных движков SQLAlchemy, что делает его универсальным выбором для современных проектов.
Интерфейс построен на Tabler — чистом и современном CSS-фреймворке, который не требует тонн JavaScript.
🤖 GitHub