PHP | Вопросы собесов
前往频道在 Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
显示更多2 341
订阅者
-124 小时
-47 天
-2430 天
帖子存档
🤔 В каких случаях используют индексы?
Индексы в базах данных используются для ускорения операций поиска и сортировки данных. Они создаются на столбцах, по которым часто выполняются запросы, такие как `SELECT`, `WHERE` или `ORDER BY`. Индексы позволяют базе данных быстро находить нужные записи без необходимости сканировать всю таблицу. Однако индексы занимают дополнительное место и могут замедлять операции вставки и обновления данных, поэтому их следует использовать с осторожностью.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое транзакции?
Это последовательности операций с базой данных, которые рассматриваются как единое целое. Они обеспечивают целостность данных, гарантируя, что либо все операции в транзакции выполнены успешно, либо никакие изменения не будут применены, если произошла ошибка.
🟠Atomicity (Атомарность)
Гарантирует, что все операции в рамках транзакции будут выполнены полностью или не будут выполнены вовсе. Если любая из операций внутри транзакции не удалась, все изменения откатываются.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
🟠Consistency (Согласованность)
Обеспечивает перевод базы данных из одного согласованного состояния в другое. Транзакции должны оставлять базу данных в корректном состоянии, удовлетворяющем всем правилам и ограничениям.
🟠Isolation (Изолированность)
Обеспечивает изолированность транзакций друг от друга. Это означает, что результаты промежуточных операций одной транзакции невидимы для других транзакций до завершения первой транзакции.
🟠Durability (Долговечность)
Гарантирует, что изменения, внесённые успешно завершённой транзакцией, будут сохранены в базе данных даже в случае сбоя системы.
🚩Использования транзакций
🟠Перевод денег между счетами
Необходимо убедиться, что обе операции (списание и зачисление) выполнены успешно, чтобы избежать ситуации, когда деньги списаны, но не зачислены.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- Если обе операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка
🟠Создание заказа в интернет-магазине
Важно убедиться, что все связанные операции (добавление записи о заказе, обновление статуса товаров, запись данных о платеже) выполнены успешно.
BEGIN TRANSACTION;
INSERT INTO orders (user_id, order_date) VALUES (1, NOW());
UPDATE products SET stock = stock - 1 WHERE product_id = 101;
INSERT INTO payments (order_id, amount) VALUES (LAST_INSERT_ID(), 99.99);
COMMIT; -- Если все операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое middleware?
Middleware в PHP — это компонент, который обрабатывает HTTP-запросы и ответы на пути между сервером и конечной точкой. Каждый middleware может модифицировать запрос, ответ или остановить выполнение цепочки, отправив ответ напрямую. Они используются для выполнения задач, таких как аутентификация, логирование, обработка ошибок и кэширование. Middleware широко применяется в современных фреймворках, таких как Laravel, для разделения логики обработки запросов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое микросервисная архитектура?
Это стиль архитектуры программного обеспечения, при котором приложение разбивается на множество мелких, независимых сервисов, каждый из которых выполняет свою узкую задачу и взаимодействует с другими сервисами через четко определенные интерфейсы, такие как HTTP API или сообщения.
🚩Основные принципы
🟠Декомпозиция:
Приложение разбивается на независимые сервисы, каждый из которых отвечает за конкретную функциональность или бизнес-логику.
🟠Автономность:
Каждый микросервис может разрабатываться, деплоиться и масштабироваться независимо от других.
🟠Технологическая гибкость:
Микросервисы могут быть написаны на разных языках программирования и использовать различные технологии, подходящие для их задач.
🟠Легковесные коммуникации:
Сервисы взаимодействуют друг с другом через легковесные протоколы, такие как HTTP/REST, gRPC, AMQP и другие.
🟠Децентрализованное управление данными:
Каждый микросервис может иметь свою собственную базу данных или хранилище данных, что упрощает управление и масштабирование.
🚩Плюсы
➕Масштабируемость:
Легко масштабировать отдельные компоненты системы в зависимости от их нагрузки.
➕Гибкость в разработке:
Различные команды могут работать над разными микросервисами одновременно, используя подходящие для них технологии.
➕Надежность:
Отказ одного микросервиса не приводит к краху всей системы, так как остальные продолжают работать.
➕Упрощенное развертывание:
Можно обновлять и развертывать микросервисы независимо друг от друга.
➕Улучшенное управление кодовой базой:
Кодовая база становится более управляемой благодаря меньшему размеру каждого микросервиса.
🚩Минусы
➖Сложность:
Управление распределенной системой может быть сложным, включая мониторинг, логирование, и отладку.
➖Коммуникационные накладные расходы:
Взаимодействие между сервисами через сеть может добавить задержки и требует надежной сетевой инфраструктуры.
➖Управление данными:
Децентрализованные данные могут привести к проблемам согласованности и необходимости сложной синхронизации.
➖Тестирование:
Тестирование системы из множества микросервисов может быть более сложным по сравнению с монолитными приложениями.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое SOLID?
SOLID — это набор из пяти принципов объектно-ориентированного проектирования, направленных на создание более устойчивого и поддерживаемого кода. Эти принципы включают: Single Responsibility (одна ответственность), Open/Closed (открытость для расширения, закрытость для изменений), Liskov Substitution (замещение Лисков), Interface Segregation (разделение интерфейсов) и Dependency Inversion (инверсия зависимостей). Применение SOLID помогает избежать чрезмерной сложности и делает код более гибким. Эти принципы часто используются для улучшения архитектуры приложений.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое магические методы?
Это специальные методы, которые имеют префикс
__ (две подчёркивания) и предназначены для выполнения определённых действий, когда происходят определённые события в объектах.
🚩Основные
🟠`__construct` и `__destruct`
__construct: Вызывается при создании нового объекта. __destruct: Вызывается при удалении объекта.
class MyClass {
public function __construct() {
echo "Object created";
}
public function __destruct() {
echo "Object destroyed";
}
}
$obj = new MyClass(); // выводит: Object created
unset($obj); // выводит: Object destroyed
🟠`__call` и `__callStatic`
__call: Вызывается при вызове недоступного метода в контексте объекта. __callStatic: Вызывается при вызове недоступного статического метода.
class MyClass {
public function __call($name, $arguments) {
echo "Calling method '$name' with arguments: " . implode(', ', $arguments);
}
public static function __callStatic($name, $arguments) {
echo "Calling static method '$name' with arguments: " . implode(', ', $arguments);
}
}
$obj = new MyClass();
$obj->nonExistingMethod('arg1', 'arg2'); // выводит: Calling method 'nonExistingMethod' with arguments: arg1, arg2
MyClass::nonExistingStaticMethod('arg1', 'arg2'); // выводит: Calling static method 'nonExistingStaticMethod' with arguments: arg1, arg2
🟠`__get` и `__set`
__get: Вызывается при доступе к недоступным свойствам. __set: Вызывается при установке значений недоступным свойствам.
class MyClass {
private $data = [];
public function __get($name) {
return $this->data[$name];
}
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
$obj = new MyClass();
$obj->nonExistingProperty = 'value';
echo $obj->nonExistingProperty; // выводит: value
🟠`__isset` и `__unset`
__isset: Вызывается при вызове isset() или empty() на недоступных свойствах. __unset: Вызывается при вызове unset() на недоступных свойствах.
class MyClass {
private $data = [];
public function __isset($name) {
return isset($this->data[$name]);
}
public function __unset($name) {
unset($this->data[$name]);
}
}
$obj = new MyClass();
$obj->property = 'value';
var_dump(isset($obj->property)); // выводит: bool(true)
unset($obj->property);
var_dump(isset($obj->property)); // выводит: bool(false)
🟠`__toString`
Вызывается при попытке использовать объект как строку (например, при echo или print).
class MyClass {
public function __toString() {
return "This is MyClass object";
}
}
$obj = new MyClass();
echo $obj; // выводит: This is MyClass object
🟠`__invoke`
Вызывается при попытке использовать объект как функцию.
class MyClass {
public function __invoke($arg) {
echo "Called with argument: $arg";
}
}
$obj = new MyClass();
$obj('some argument'); // выводит: Called with argument: some argument
🟠`__clone`
Вызывается при клонировании объекта.
class MyClass {
public function __clone() {
echo "Object cloned";
}
}
$obj = new MyClass();
$clonedObj = clone $obj; // выводит: Object cloned
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое транзакция?
Транзакция — это последовательность операций с базой данных, которые выполняются как единое целое. Транзакции обеспечивают целостность данных, гарантируя, что все операции будут завершены успешно или, в случае ошибки, откатятся к исходному состоянию. Основные свойства транзакций описываются понятием ACID: атомарность, согласованность, изолированность и долговечность. Транзакции часто используются для обеспечения надежности при работе с критически важными данными.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какие бывают области видимости?
В PHP существуют четыре основных области видимости (scope), которые определяют, где переменные и другие элементы кода могут быть использованы. Это глобальная, локальная, область видимости статических переменных и область видимости классов (свойств и методов).
🟠Глобальная область видимости
Переменные, объявленные вне всех функций и классов, имеют глобальную область видимости. Такие переменные доступны в любом месте кода, за исключением функций и методов классов, если они не объявлены явно как глобальные внутри этих функций или методов.
$globalVar = "I am global";
function testGlobal() {
global $globalVar; // делаем глобальную переменную доступной внутри функции
echo $globalVar; // выводит: I am global
}
testGlobal();
🟠Локальная область видимости
Переменные, объявленные внутри функции, имеют локальную область видимости и доступны только внутри этой функции. Они недоступны вне функции или в других функциях.
function testLocal() {
$localVar = "I am local";
echo $localVar; // выводит: I am local
}
testLocal();
echo $localVar; // ошибка, так как $localVar не доступна вне функции
🟠Область видимости статических переменных
Статические переменные внутри функции сохраняют своё значение между вызовами этой функции. Они имеют локальную область видимости, но их значение сохраняется.
function testStatic() {
static $count = 0;
$count++;
echo $count; // при каждом вызове функции значение $count будет увеличиваться
}
testStatic(); // выводит: 1
testStatic(); // выводит: 2
testStatic(); // выводит: 3
🟠Область видимости классов (свойства и методы)
В контексте классов области видимости определяют доступ к свойствам и методам. В PHP существуют три модификатора доступа: public, protected и private.
public: Свойства и методы, доступные отовсюду (изнутри класса, из дочерних классов и вне классов).
protected: Свойства и методы, доступные только изнутри класса и его дочерних классов.
private: Свойства и методы, доступные только изнутри класса.
class MyClass {
public $publicVar = "Public";
protected $protectedVar = "Protected";
private $privateVar = "Private";
public function showVars() {
echo $this->publicVar; // доступно
echo $this->protectedVar; // доступно
echo $this->privateVar; // доступно
}
}
$obj = new MyClass();
echo $obj->publicVar; // доступно
// echo $obj->protectedVar; // ошибка, доступно только изнутри класса и дочерних классов
// echo $obj->privateVar; // ошибка, доступно только изнутри класса
$obj->showVars(); // доступно и выводит все три свойства
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое абстрактный класс?
Абстрактный класс — это класс, который не может быть создан как объект и служит для того, чтобы задавать общие свойства и методы для классов-наследников. Он может содержать как абстрактные, так и конкретные методы с реализацией. Наследники обязаны реализовать все абстрактные методы родительского класса. Абстрактные классы полезны, когда требуется частичная реализация с обязательной реализацией некоторых методов в дочерних классах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое PHP FPM?
PHP-FPM (PHP FastCGI Process Manager) – это альтернативная реализация PHP FastCGI, предназначенная для обеспечения высокой производительности и управляемости PHP-приложений.
🚩Плюсы
➕Повышение производительности:
PHP-FPM позволяет значительно улучшить производительность веб-серверов за счет управления пулом PHP-процессов, которые могут обрабатывать запросы параллельно.
➕Масштабируемость:
Он легко масштабируется для работы с большим количеством одновременных запросов.
➕Настраиваемость:
PHP-FPM предлагает широкие возможности для настройки, такие как управление количеством процессов, лимиты на использование ресурсов, настройка поведения при возникновении ошибок и многое другое.
➕Изоляция окружений:
Можно настроить несколько пулов процессов для различных приложений, что позволяет изолировать их друг от друга.
🚩Как работает?
1⃣Запуск пула процессов:
При старте PHP-FPM инициализирует пул процессов, которые готовы принимать запросы.
2⃣Обработка запросов:
Веб-сервер перенаправляет запросы на сокет PHP-FPM, где процессы обрабатывают их и возвращают результаты.
3⃣Управление процессами:
PHP-FPM управляет количеством процессов, создавая новые при необходимости и завершая неиспользуемые для оптимизации использования ресурсов.
🚩Пример конфигурации PHP-FPM
PHP-FPM (обычно находится в
/etc/php/7.x/fpm/pool.d/www.conf):
[www]
user = www-data
group = www-data
listen = /run/php/php7.x-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
Nginx для использования PHP-FPM:
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.x-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Ставь 👍 и забирай 📚 Базу знаний🤔 В чём суть абстрактного класса?
Абстрактный класс — это класс, который нельзя инстанцировать напрямую, и он предназначен для того, чтобы служить базой для других классов. Он может содержать абстрактные методы, которые должны быть реализованы в классах-наследниках. Абстрактный класс позволяет определять общую функциональность для всех наследников, предоставляя возможность переопределять или дополнять её. Это помогает улучшить структуру кода и избежать дублирования.
Ставь 👍 и забирай 📚 Базу знаний
Запустите рекламу в телеграм-каналах с Яндекс Директом
Перфоманс-реклама теперь в телеграм-каналах ⚡
Яндекс Директ знает, как привлечь целевую аудиторию 💰👌
Попробовать
#реклама
yandex.ru
О рекламодателе
🤔 Как сделать так, чтобы сессии не хранились в файле?
Для хранения сессий не в файлах в PHP, можно использовать другие механизмы хранения, такие как базы данных, кэш-сервисы (например, Redis или Memcached) или специализированные хранилища.
🚩Хранение сессий в базе данных
1⃣Создайте таблицу для хранения сессий:
CREATE TABLE sessions (
id VARCHAR(255) PRIMARY KEY,
data TEXT,
last_access TIMESTAMP
);
2⃣Создайте обработчики сессий:
Создайте класс для обработки сессий, реализующий интерфейс SessionHandlerInterface.
class DBSessionHandler implements SessionHandlerInterface {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function open($savePath, $sessionName) {
return true;
}
public function close() {
return true;
}
public function read($id) {
$stmt = $this->pdo->prepare("SELECT data FROM sessions WHERE id = :id");
$stmt->bindParam(':id', $id);
$stmt->execute();
$session = $stmt->fetch(PDO::FETCH_ASSOC);
return $session ? $session['data'] : '';
}
public function write($id, $data) {
$stmt = $this->pdo->prepare("REPLACE INTO sessions (id, data, last_access) VALUES (:id, :data, NOW())");
$stmt->bindParam(':id', $id);
$stmt->bindParam(':data', $data);
return $stmt->execute();
}
public function destroy($id) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE id = :id");
$stmt->bindParam(':id', $id);
return $stmt->execute();
}
public function gc($maxlifetime) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_access < NOW() - INTERVAL :maxlifetime SECOND");
$stmt->bindParam(':maxlifetime', $maxlifetime, PDO::PARAM_INT);
return $stmt->execute();
}
}
3⃣Инициализация сессий:
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$handler = new DBSessionHandler($pdo);
session_set_save_handler($handler, true);
session_start();
🚩Хранение сессий в Redis
1⃣Установите расширение `phpredis`Для Ubuntu:
sudo apt-get install php-redis
2⃣Используйте Redis для хранения сессий:
Настройте PHP для использования Redis в качестве хранилища сессий, добавив настройки в файл php.ini или в коде.
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
Ставь 👍 и забирай 📚 Базу знаний🤔 Чем отличается абстрактный класс от интерфейса?
Абстрактный класс может содержать как абстрактные методы (без реализации), так и методы с реализацией, в то время как интерфейс не содержит реализации методов до PHP 8. Абстрактный класс может содержать поля и конструкторы, а интерфейс — только сигнатуры методов. Класс может наследовать только один абстрактный класс, но реализовать несколько интерфейсов. Абстрактный класс используется, когда требуется частичная реализация, а интерфейс — для создания контракта.
Ставь 👍 и забирай 📚 Базу знаний
Обучаем Java-разработчиков оплата после выхода на работу
В Kata Academy можно выучиться на Java-разработчика бесплатно, а заплатить уже после трудоустройства по специальности из фактической зарплаты.
Если задуматься, то все в выигрыше:
— ты получаешь работу в Москве или Санкт-Петербурге с хорошей зарплатой, мы получаем процент за инвестиции в тебя;
— в наших интересах научить тебя так, чтобы твоя зарплата была как можно выше;
— мы прокачиваем твои навыки еще 2 года после курса: проводим выездные мероприятия и мастер-классы — и доходы наших выпускников растут;
— мы не зависим от банков и их рассрочек — кризис не повлиял на доступность курсов.
Чтобы попасть на курс, нужно выполнить небольшое тестовое задание. Переходи по ссылке и оставляй заявку!
Узнать больше
#реклама 16+
kata.academy
О рекламодателе
🤔 Что такое агрегат?
Агрегат – это термин, часто используемый в области баз данных и программирования, который обозначает способ группировки данных для выполнения различных операций, таких как суммирование, подсчёт, нахождение среднего значения и другие. В реляционных базах данных агрегаты применяются для выполнения агрегатных функций, таких как
SUM(), COUNT(), AVG(), MAX(), MIN() и других.
🚩Зачем нужны?
🟠Анализ данных:
Агрегаты позволяют получить сводные данные, которые помогают анализировать и понимать большие наборы данных. Например, можно узнать общее количество продаж, среднюю стоимость заказа, максимальную и минимальную зарплату сотрудников и т.д.
🟠Оптимизация запросов:
Использование агрегатных функций позволяет выполнять сложные вычисления на сервере базы данных, что экономит время и ресурсы по сравнению с выполнением этих операций на клиентской стороне.
🚩Примеры использования агрегатных функций:
Суммирование (SUM):
-- Получение общей суммы всех заказов
SELECT SUM(total_amount) AS total_sales
FROM orders;
Подсчёт (COUNT):
-- Подсчёт общего количества заказов
SELECT COUNT(*) AS total_orders
FROM orders;
Среднее значение (AVG):
-- Нахождение средней суммы заказа
SELECT AVG(total_amount) AS average_order_value
FROM orders;
Максимальное значение (MAX):
-- Нахождение максимальной суммы заказа
SELECT MAX(total_amount) AS max_order_value
FROM orders;
Минимальное значение (MIN):
-- Нахождение минимальной суммы заказа
SELECT MIN(total_amount) AS min_order_value
FROM orders;
🚩 Группировка данных с использованием GROUP BY:
Для более сложных запросов можно использовать агрегатные функции вместе с оператором GROUP BY, чтобы группировать данные по определённому критерию. В этом запросе результаты будут сгруппированы по customer_id, и для каждого клиента будет рассчитана общая сумма заказов.
-- Получение общей суммы заказов для каждого клиента
SELECT customer_id, SUM(total_amount) AS total_sales_per_customer
FROM orders
GROUP BY customer_id;
Ставь 👍 и забирай 📚 Базу знаний🤔 Какое ключевое слово используется для указания класса в PHP, который не может быть унаследован?
🤔 Что такое внешний ключ?
Внешний ключ (foreign key) – это понятие из области реляционных баз данных, которое помогает устанавливать связи между таблицами.
🚩Зачем нужен внешний ключ?
🟠Обеспечение целостности данных:
Внешние ключи помогают гарантировать, что значения в столбце внешнего ключа всегда соответствуют значениям в первичном ключе другой таблицы. Это предотвращает создание "висячих" ссылок, когда запись в одной таблице ссылается на несуществующую запись в другой таблице.
🟠Упрощение управления связями между таблицами:
Внешние ключи облегчают управление и обновление связанных данных. Например, если удалить запись в родительской таблице, можно настроить каскадное удаление связанных записей в дочерней таблице.
🚩Как используется внешний ключ?
Внешний ключ создаётся при помощи SQL-запросов. Рассмотрим пример двух таблиц:
orders (заказы) и customers (клиенты). Каждому заказу в таблице orders соответствует клиент в таблице customers.
-- Создание таблицы клиентов
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100)
);
-- Создание таблицы заказов с внешним ключом
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
customer_id в таблице orders является внешним ключом, который ссылается на customer_id в таблице customers. Это гарантирует, что каждое значение customer_id в таблице orders соответствует существующему customer_id в таблице customers.
🚩Каскадные действия
Существует возможность настроить каскадные действия для внешних ключей. Например:
-- Создание таблицы заказов с каскадным удалением
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
ON DELETE CASCADE
);
Ставь 👍 и забирай 📚 Базу знаний⚡️ IT-обучение теперь в Telegram!
В cвязи с недавнем замедлением Ютуба — лучшие обучающие каналы переехали в Telegram
Вот каналы для айтишников:
👩💻 PHP: @PHP
🖥 Базы Данных & SQL: @SQL
👩💻 Frontend: @Frontend
⚙️ Backend: @Backend
🤓 Общее айти: @portalToIT
👩💻 Python: @Python
📱 GitHub: @GitHub
👩💻 Java: @Java
👩💻 C#: @Csharp
👩💻 С/С++: @Cpp
👩💻 Golang: @Golang
👩💻 Моб. разработка: @MobDev
👩💻 Разработка игр: @GameDev
👩💻 DevOps: @DevOps
🖥 Data Science: @DataScience
🤔 Хакинг & ИБ: @InfoSec
🐞 Тестирование: @QA
📱 Маркетинг: @Marketing
🖥 Дизайн: @Design
➡️ Сохраняйте себе, чтобы не потерять
