2. Микросервисы: Laravel может быть избыточен из-за большого количества встроенных компонентов.
3. Проекты с крайне низким бюджетом: из-за сложности поддержки на минимальных конфигурациях серверов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5
Это переменные, имена которых определяются во время выполнения программы. Это позволяет создавать, модифицировать или обращаться к переменным динамически, основываясь на входных данных или условиях выполнения программы. Такой подход может быть полезен в сценариях, где структура данных неизвестна на момент написания кода или когда нужно генерировать переменные на лету в зависимости от контекста выполнения.
Имена переменных могут быть динамически сформированы с использованием переменных переменных
$name = "variable";
$$name = "Hello, World!";
echo $variable; // Выведет "Hello, World!"
Плюсы и минусы
позволяет создавать более адаптивные и динамические программы, которые могут работать с данными, структура которых заранее неизвестна.
упрощает работу с большим количеством похожих переменных или свойств объекта без необходимости явного объявления каждой переменной.
использование динамических переменных может сделать код менее понятным и труднее для отладки, поскольку не всегда ясно, какие переменные создаются и используются.
динамическое создание большого количества переменных может привести к неэффективному использованию памяти и снижению производительности.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Это два подхода к проектированию структуры баз данных. Они используются для оптимизации хранения данных и повышения производительности запросов.
Это процесс структурирования базы данных для уменьшения избыточности данных и устранения аномалий при обновлении, вставке или удалении данных.
Это помогает экономить место и поддерживать согласованность данных.
Например, если данные изменяются в одном месте, то изменения не нужно делать в других местах.
Удаление повторяющихся групп и дублирующихся данных.
Устранение частичной зависимости данных от составного ключа.
Устранение транзитивной зависимости (когда данные зависят не от первичного ключа напрямую, а через другие поля).
BCNF (нормальная форма Бойса-Кодда) и другие более сложные формы.
Это процесс намеренного добавления избыточности данных для повышения производительности запросов.
Объединение таблиц или добавление дублированных данных уменьшает количество соединений (
JOIN) между таблицами.SELECT o.OrderID, c.CustomerName, p.ProductName, p.ProductPrice
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
JOIN Products p ON o.ProductID = p.ProductID;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Причины: отсутствие индексов, сложные объединения, большой объём данных.
2. Оптимизация: использование индексов, анализ плана выполнения (EXPLAIN) и уменьшение объёма данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это ПО, которое располагается между веб-сервером и приложением. Оно обрабатывает входящие запросы до того, как они достигнут вашего приложения, или обрабатывает исходящие ответы после того, как приложение их сгенерировало.
Может изменять или проверять запросы перед передачей их в приложение. Например, оно может проверять наличие валидных токенов доступа для аутентификации или осуществлять проверку прав доступа.
Также может изменять ответы перед тем, как они будут отправлены пользователю, например, добавлять нужные заголовки HTTP или сжимать данные.
Оно может записывать информацию о запросах и ответах для анализа трафика или обнаружения ошибок.
Часто используется для централизованной обработки ошибок, позволяя управлять ошибками элегантно и единообразно.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class CheckAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!Auth::check()) {
return redirect('/login');
}
return $next($request);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
1. Они защищают от SQL-инъекций, так как параметры передаются отдельно от запроса.
2. Улучшают производительность, так как один запрос можно выполнить несколько раз с разными данными.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В PHP существуют различные уровни ошибок, которые помогают разработчикам выявлять и исправлять проблемы в коде. Эти уровни ошибок задаются с помощью констант и управляются функцией
error_reporting(). Рассмотрим основные уровни ошибок:Критическая ошибка, которая приводит к завершению работы скрипта.
Например, вызов несуществующей функции
someUndefinedFunction(); // Вызовет E_ERROR
Не фатальная ошибка, скрипт продолжит выполнение.
Например, деление на ноль или использование
include() для несуществующего файла:echo 10 / 0; // Вызовет E_WARNING
Ошибка синтаксиса в коде, обнаруживаемая на этапе компиляции.
Например, забытая точка с запятой:
echo "Hello" // Отсутствует ;
Сообщает о некритичных ошибках, например, об использовании неинициализированной переменной:
echo $undefinedVariable; // Вызовет E_NOTICE
Аналогична
E_ERROR, но возникает на этапе загрузки PHP. Аналогична
E_WARNING, но на этапе загрузки PHP. Ошибки, связанные с компиляцией скрипта, например, при ошибке в
require. Предупреждения компилятора.
Вызывается вручную с помощью
trigger_error(): trigger_error("Критическая ошибка!", E_USER_ERROR);Аналогично
E_WARNING, но создаётся пользователем. Аналогично
E_NOTICE, но вызывается вручную. Сообщает о потенциальных проблемах совместимости.
Фатальная ошибка, которую можно обработать через
set_error_handler(). Указывает, что используется устаревшая функция.
Вызывается пользователем через
trigger_error(). PHP позволяет включать или выключать определённые ошибки с помощью
error_reporting()error_reporting(E_ALL); // Включить все ошибки
error_reporting(0); // Отключить вывод ошибок
error_reporting(E_ERROR | E_WARNING); // Только критические ошибки и предупреждения
Также можно использовать
display_errors для отображения ошибок в браузереini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Типизация в программировании — это механизм, который определяет, как значения различных типов (например, целые числа, строки, объекты и т.д.) обрабатываются и взаимодействуют в языке программирования. Типизация помогает предотвратить ошибки, связанные с некорректным использованием данных, и улучшает читаемость и поддержку кода.
Типы переменных известны и проверяются на этапе компиляции. Примеры языков: Java, C++, TypeScript.
Типы переменных определяются и проверяются во время выполнения программы. Примеры языков: Python, JavaScript, PHP.
Язык строго следит за типами, не позволяя неявные преобразования между ними. Примеры языков: Haskell, Java.
Язык допускает неявные преобразования между типами. Примеры языков: PHP, JavaScript.
PHP — язык с динамической и слабой типизацией, но с версией 7.0 и выше появилась возможность использовать строгую типизацию.
$number = 10;
$number = "ten"; // PHP позволяет это, так как тип переменной может изменяться
С PHP 7.0 можно использовать строгую типизацию для функций и методов. Это позволяет явно указывать, какого типа аргументы и возвращаемое значение должны быть.
declare(strict_types=1); // Включает строгую типизацию
function add(int $a, int $b): int {
return $a + $b;
}
echo add(2, 3); // Работает
// echo add(2, "3"); // Ошибка, так как второй аргумент не является целым числом
Типизация помогает обнаруживать ошибки на ранних этапах разработки, таких как попытка выполнения некорректных операций с данными.
Явное указание типов делает код более понятным и предсказуемым, что облегчает его поддержку и развитие.
Статически типизированные языки позволяют компиляторам оптимизировать выполнение кода, так как типы известны на этапе компиляции.
Типизация служит дополнительной документацией, помогая разработчикам понять, какие данные ожидаются и возвращаются функциями и методами.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это акроним, описывающий четыре ключевых свойства транзакций в системах управления базами данных (СУБД), обеспечивающие надежное выполнение транзакций даже в условиях ошибок, сбоев и множественного доступа. Эти свойства важны для обеспечения правильности и устойчивости данных. Он состоит из следующих компонентов:
Гарантирует, что все операции в рамках одной транзакции либо выполняются полностью, либо не выполняются вообще. Если какая-либо часть транзакции не может быть завершена, система откатит все уже выполненные операции, возвращая базу данных в состояние, которое существовало до начала транзакции. Это "всё или ничего".
Означает, что каждая транзакция переводит базу данных из одного согласованного состояния в другое. Согласованность обеспечивает соблюдение всех правил и ограничений базы данных, таких как ключи, ограничения целостности и триггеры, после завершения транзакции.
Определяет способ одновременного выполнения множества транзакций без оказания влияния друг на друга. Это свойство предотвращает проблемы, связанные с одновременным доступом, такие как "грязное чтение", "неповторяющееся чтение" и "фантомное чтение". СУБД обычно предлагают различные уровни изоляции, которые могут быть настроены в зависимости от нужд приложения.
Гарантирует, что как только транзакция была подтверждена, все изменения, сделанные транзакцией, сохраняются и остаются в базе данных даже в случае сбоя, например, при потере питания. Это означает, что система должна сохранять все записи в надежное, неизменяемое хранилище.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Для ускорения развертывания приложений в Docker существует несколько методов и практик, которые помогают оптимизировать сборку и запуск контейнеров. Вот некоторые из них:
Каждая инструкция в Dockerfile создает новый слой в образе. Старайтесь минимизировать количество слоев, объединяя инструкции, где это возможно.
# Плохо
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y vim
# Хорошо
RUN apt-get update && \
apt-get install -y curl vim
Выберите наиболее подходящий базовый образ, который минимально необходим для вашего приложения. Использование минималистичных образов, таких как
alpine, может существенно уменьшить размер образа.FROM php:7.4-fpm-alpine
Сначала копируйте файлы с зависимостями (например,
composer.json, package.json) и устанавливайте их, а затем копируйте остальной код. Это позволит Docker использовать кэш на этапе установки зависимостей, если они не изменились.FROM php:7.4-fpm-alpine
# Установка зависимостей
COPY composer.json composer.lock /app/
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader
# Копирование кода
COPY . /app
Многоступенчатая сборка позволяет собирать и тестировать ваше приложение в одном этапе и копировать только необходимые файлы в финальный образ, что уменьшает размер финального образа.
# Сборочный этап
FROM composer:latest AS builder
WORKDIR /app
COPY composer.json composer.lock /app/
RUN composer install --no-dev --optimize-autoloader
# Финальный этап
FROM php:7.4-fpm-alpine
WORKDIR /app
COPY --from=builder /app /app
COPY . /app
При разработке используйте кэш Docker для ускорения сборки. Для этого нужно правильно организовать порядок инструкций в Dockerfile, чтобы неизменные части использовали кэш.
Если вы используете Docker Compose, убедитесь, что сервисы поднимаются параллельно и что вы используете возможность кэширования сборок.
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app_db
ports:
- "3306:3306"
При частых изменениях кода старайтесь кэшировать слои, которые не меняются, и использовать промежуточные образы для ускорения сборки.
# Использование промежуточного образа
FROM php:7.4-fpm-alpine AS base
COPY . /app
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader
FROM base AS dev
RUN apk add --no-cache bash
CMD ["php-fpm"]
FROM base AS prod
CMD ["php-fpm"]
Используйте готовые образы, где уже установлены все необходимые зависимости для разработки, что сократит время сборки образов.
Используйте параллельную сборку и запуск контейнеров, если это возможно. Docker Compose поддерживает параллельный запуск, что может значительно ускорить процесс развертывания.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤔1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Это процесс создания и поддержания копий данных в разных местах для обеспечения доступности, надежности и производительности системы. Она используется в базах данных, файловых системах и других системах хранения данных.
Если одна копия данных становится недоступной из-за сбоя или отключения сервера, другая копия может продолжить обслуживание запросов, минимизируя время простоя.
Репликация позволяет распределить нагрузку на несколько серверов, что улучшает время отклика системы при больших объемах запросов.
Репликация обеспечивает наличие резервных копий данных, которые можно использовать для восстановления системы после сбоя.
Репликация позволяет хранить данные ближе к пользователям, что снижает задержку при доступе к данным.
Данные одновременно записываются на основной и реплицированный серверы. Высокая консистентность данных. Замедление операций записи, так как они должны быть подтверждены на всех репликах.
Данные сначала записываются на основной сервер, а затем копируются на реплицированный сервер с задержкой. Быстрые операции записи на основной сервер. Возможность временной неконсистентности данных между серверами.
Все данные копируются на все реплицированные серверы. Простота реализации и высокая доступность данных. Высокие затраты на хранение и передачу данных.
Только часть данных копируется на реплицированные серверы. Экономия ресурсов хранения и передачи данных. Более сложное управление данными.
MySQL поддерживает репликацию, что позволяет автоматически копировать данные с одного сервера (мастера) на один или несколько других серверов (слейвов).
-- Включаем бинарные логи на мастере
[mysqld]
log-bin=mysql-bin
server-id=1
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
-- Настройки слейва
[mysqld]
server-id=2
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='replica_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS= 107;
START SLAVE;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
• Он хранит ссылки на зависимости и позволяет получить их по запросу.
• Недостаток: сложнее отслеживать зависимости и тестировать код, так как локатор создаёт скрытые связи.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Составной индекс (Composite Index) – это индекс, который создаётся сразу на несколько колонок таблицы.
Допустим, у нас есть таблица
orders CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
status VARCHAR(50),
created_at DATETIME
);
И мы выполняем поиск по
user_id и status SELECT * FROM orders WHERE user_id = 5 AND status = 'paid';
Создаём составной индекс (ускоряем поиск)
CREATE INDEX idx_user_status ON orders(user_id, status);
Как SQL использует составной индекс? (Правило слева направо)
Важный момент: составной индекс работает слева направо.
SELECT * FROM orders WHERE user_id = 5 AND status = 'paid'; -- ✅ Использует индекс
SELECT * FROM orders WHERE user_id = 5; -- ✅ Использует индекс (user_id - первый в индексе)
НЕ работает
SELECT * FROM orders WHERE status = 'paid'; -- ❌ Индекс не используется (user_id пропущен)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Middleware — это промежуточный слой между запросом клиента и сервером, который обрабатывает запросы до их передачи конечному обработчику. Он используется для выполнения задач, таких как аутентификация, логирование, кэширование и обработка ошибок. Middleware помогает разделить логику приложения на независимые компоненты и улучшает масштабируемость и управляемость кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Нормальные формы (Normal Forms, NF) в базах данных — это правила, которые помогают организовать данные так, чтобы избежать избыточности и аномалий при обновлении, удалении и вставке.
убирает повторяющиеся группы и делает все столбцы атомарными.
Что нужно сделать?
Каждое поле должно содержать только одно значение.
В таблице нет повторяющихся строк.
убирает зависимости от части составного ключа.
Что нужно сделать?
Данные, которые зависят не от всего первичного ключа, вынести в отдельные таблицы.
Должна быть уже в 1NF.
убирает транзитивные зависимости.
Что нужно сделать?
Данные должны зависеть только от первичного ключа и не зависеть от других неключевых полей.
Должна быть уже в 2NF.
более строгая версия 3NF, исключает случаи, когда таблица имеет несколько потенциальных ключей, но один из них влияет на другой.
убирает многозначные зависимости (например, если студент изучает несколько предметов, но предметы никак не связаны друг с другом).
разбиение таблицы на подтаблицы для минимизации избыточности данных.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Модификатор final запрещает наследование класса, если он указан перед его объявлением.
Если final используется для метода, он запрещает переопределение этого метода в дочерних классах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1