PHP Backend | YeaHub
231 subscribers
134 photos
7 videos
240 links
Теория, подготовка к интервью и курсы для PHP разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#Вакансии
👨‍💻 Senior PHP developer

Локация: Удалённо
Компания: NovaSpin
ЗП: от 3 000 до 4 500 $
Занятость: Полная

NovaSpin - инновационная компания, занимающаяся разработкой онлайн-казино! Мы с гордостью предлагаем возможность присоединиться к нашей команде, которая работает в самом сердце игровой индустрии.

🚩Задачи
▪️Разработка и поддержка веб-приложения с использованием фреймворка Laravel.
Интеграция и работа с Centrifugo для организации WebSocket соединений.
▪️Проектирование и оптимизация баз данных на PostgreSQL
▪️Настройка и управление очередями сообщений с помощью RabbitMQ.
▪️Оптимизация производительности приложений с использованием Laravel Octane.
▪️Участие в архитектурном планировании и ревью кода.

🚩Ожидания от кандидата
▪️Глубокие знания и опыт работы с PHP (5+ лет).
▪️Опыт работы с Laravel (3+ лет).
▪️Опыт работы в igaming сфере.
▪️Знание и опыт работы с вебсокетами.
▪️Уверенные знания PostgreSQL, умение писать и оптимизировать SQL-запросы.
▪️Опыт работы с Redis и RabbitMQ.
▪️Знание и опыт использования Laravel Octane.
▪️Опыт работы с системами контроля версий (Git).
▪️Понимание принципов ООП, шаблонов проектирования и лучших практик разработки.
▪️Опыт работы с Docker.
▪️Навыки отладки и профилирования приложений.
▪️Хорошие коммуникативные навыки и умение работать в команде.
▪️Желание расти, развивать продукт и делать новые качественные фичи!

🚩Преимущества
▪️Опыт работы с высоконагруженными системами и оптимизации производительности.
▪️Опыт работы с CI/CD и DevOps практиками.

🚩Что мы предлагаем
▪️Конкурентоспособная зарплата с выплатами два раза в месяц в USDT.
▪️Удаленная работа с гибким графиком.
▪️Сотрудничество и поддержка в рабочей среде.
▪️Возможности для непрерывного обучения и профессионального развития.

💬 Резюме отправлять: @vasinyaroslav

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой метод используется для получения MIME-типа файла в PHP?
Anonymous Quiz
50%
mime_type()
10%
get_file_mime()
10%
filetype()
30%
get_mime_type()
#ЧеКак
🤔 Что такое списочный тип?

Это структура данных, представляющая упорядоченный набор элементов, где каждый элемент связан с предыдущим и следующим.
🟠Пример — связанный список (linked list), где каждый узел содержит значение и ссылку на следующий узел.
🟠Такие типы обеспечивают удобное добавление и удаление элементов, но имеют медленный доступ по индексу (O(n)).

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Что такое heap object?

Это объект, размещённый в куче, где память выделяется динамически. Такие объекты хранятся до тех пор, пока на них есть ссылки, и освобождаются автоматически, когда ссылки удаляются (через сборщик мусора или ARC).

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой из перечисленных типов данных в PHP не является скалярным?
Anonymous Quiz
0%
Integer
17%
String
67%
Array
17%
Float
#ЛитКод
Задача: 353. Design Snake Game

Разработайте игру "Змейка", которая играется на устройстве с экраном размером height x width. Поиграйте в игру онлайн, если вы не знакомы с ней.

Змейка изначально находится в верхнем левом углу (0, 0) с длиной в 1 единицу.
Вам дан массив food, где food[i] = (ri, ci) представляет собой строку и столбец позиции пищи, которую змейка может съесть. Когда змейка съедает кусочек пищи, ее длина и очки игры увеличиваются на 1.
Каждый кусочек пищи появляется по очереди на экране, то есть второй кусочек пищи не появится, пока змейка не съест первый кусочек пищи.
Когда кусочек пищи появляется на экране, гарантируется, что он не появится на блоке, занятом змейкой.
Игра заканчивается, если змейка выходит за пределы экрана (врезается в стену) или если ее голова занимает пространство, которое занимает ее тело после движения (например, змейка длиной 4 не может врезаться в себя).

Реализуйте класс SnakeGame:
SnakeGame(int width, int height, int[][] food) Инициализирует объект с экраном размером height x width и позициями пищи.
int move(String direction) Возвращает счет игры после применения одного движения змейки в направлении. Если игра окончена, верните -1.

Пример:
Input
["SnakeGame", "move", "move", "move", "move", "move", "move"]
[[3, 2, [[1, 2], [0, 1]]], ["R"], ["D"], ["R"], ["U"], ["L"], ["U"]]
Output
[null, 0, 0, 1, 1, 2, -1]


👨‍💻 Алгоритм:

1⃣Инициализируйте объекты игры, такие как экран, еда, положение змейки и счетчик, в конструкторе.

2⃣Реализуйте функцию для вычисления нового положения головы змейки на основе направления движения.

3⃣Обновите положение змейки и проверьте условия завершения игры. Верните текущий счет или -1, если игра закончена.

😊 Решение:
class SnakeGame {
private $width;
private $height;
private $food;
private $score;
private $snake;
private $snakeSet;
private $foodIndex;

function __construct($width, $height, $food) {
$this->width = $width;
$this->height = $height;
$this->food = $food;
$this->score = 0;
$this->snake = [[0, 0]];
$this->snakeSet = ['0,0' => true];
$this->foodIndex = 0;
}

function move($direction) {
$head = $this->snake[0];
$newHead = $head;

switch ($direction) {
case "U":
$newHead[0]--;
break;
case "D":
$newHead[0]++;
break;
case "L":
$newHead[1]--;
break;
case "R":
$newHead[1]++;
break;
}

if ($newHead[0] < 0 || $newHead[0] >= $this->height || $newHead[1] < 0 || $newHead[1] >= $this->width) {
return -1;
}

$newHeadStr = implode(',', $newHead);
if (isset($this->snakeSet[$newHeadStr]) && $newHeadStr !== implode(',', end($this->snake))) {
return -1;
}

if ($this->foodIndex < count($this->food) && $newHead[0] === $this->food[$this->foodIndex][0] && $newHead[1] === $this->food[$this->foodIndex][1]) {
$this->foodIndex++;
} else {
$tail = array_pop($this->snake);
unset($this->snakeSet[implode(',', $tail)]);
}

array_unshift($this->snake, $newHead);
$this->snakeSet[$newHeadStr] = true;

return count($this->snake) - 1;
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что означает аббревиатура PDO в контексте PHP?
Anonymous Quiz
7%
PHP Data Oriented
43%
PHP Database Object
43%
PHP Data Objects
7%
PHP Database Oriented
#ЛитКод
Задача: 616. Add Bold Tag in String

Вам дана строка s и массив строк words. Вы должны добавить закрытую пару полужирных тегов <b> и </b>, чтобы обернуть подстроки в s, которые существуют в words. Если две такие подстроки пересекаются, вы должны обернуть их вместе только одной парой закрытых полужирных тегов. Если две подстроки, обернутые полужирными тегами, идут подряд, вы должны объединить их. Верните s после добавления полужирных тегов.

Пример:
Input: s = "abcxyz123", words = ["abc","123"]
Output: "<b>abc</b>xyz<b>123</b>"


👨‍💻 Алгоритм:

1⃣Найдите все позиции вхождений подстрок из words в строку s и пометьте эти позиции для выделения тегами <b> и </b>.

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

3⃣Постройте новую строку s, добавляя теги <b> и </b> в определенные позиции.

😎 Решение:
function addBoldTag($s, $words) {
$bold = array_fill(0, strlen($s), false);

foreach ($words as $word) {
$pos = strpos($s, $word);
while ($pos !== false) {
for ($i = $pos; $i < $pos + strlen($word); $i++) {
$bold[$i] = true;
}
$pos = strpos($s, $word, $pos + 1);
}
}

$result = "";
$i = 0;
while ($i < strlen($s)) {
if ($bold[$i]) {
$result .= "<b>";
while ($i < strlen($s) && $bold[$i]) {
$result .= $s[$i];
$i++;
}
$result .= "</b>";
} else {
$result .= $s[$i];
$i++;
}
}

return $result;
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Как переопределить хранение сессий?

Хранение сессий можно переопределить путём изменения способа их хранения:
Файлы: хранение на локальной файловой системе.
Базы данных: использование реляционных баз для хранения сессий, что упрощает их масштабирование.
Кэш: хранение в Redis, Memcached для быстрого доступа.
Для настройки нужно изменить конфигурацию приложения или middleware, например, в Django, Flask или Spring.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Что известно о MVC?

Это архитектурный шаблон, который разделяет приложение на три компонента:
🟠Model: управляет данными и бизнес-логикой.
🟠View: отвечает за отображение данных пользователю.
🟠Controller: обрабатывает пользовательский ввод, связывает Model и View.
Это разделение упрощает разработку, тестирование и поддержку приложения.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Вакансии
👨‍💻 Backend PHP developer (Middle)

Локация: Удаленно
Компания: Igaming-Soft
ЗП: от 2 500 до 3 000 $
Занятость: Полная
Локация: Кипр
Трудоустройство: самозанятый
Сфера: GAMBLING

🚩Требования
🔵 Опыт работы с php 7+
🔵Опыт разработки коммерческих продуктов
🔵Понимание ООП, алгоритмов и структур данных
🔵Опыт работы со сторонними API и проектирование REST API
🔵Опыт интеграции платежных систем
🔵Базовые шаблоны проектирования
🔵Опыт работы с GIT, работа с ветками, чистота веток
🔵Опыт работы с MySQL. Агрегаты, джоины, запросы от руки. Важно уметь писать сложные запросы без фреймворков и шаблонов.
🔵консоль (bash), Linux или WSL
🔵Опыт удаленной разработки, работы в команде

🚩Будет плюсом
🔵Опыт работы с высоконагруженными системами
🔵Опыт работы с Websocket
🔵Опыт работы с Docker и/или Docker Swarm
🔵Инструменты Jira, Gitlab/Github, git flow

​​​​​​​​​​​​​💬 Резюме отправлять: @Nbagama

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Какую проблему решает декоратор?

Декоратор позволяет добавлять новую функциональность к существующему объекту или функции без изменения их исходного кода.
🟠Это решает проблему модификации поведения без нарушения принципа открытости/закрытости (SOLID).
🟠Удобен для добавления динамических изменений, таких как логирование, кэширование или аутентификация.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Какую проблему решает декоратор?

Декоратор позволяет добавлять новую функциональность к существующему объекту или функции без изменения их исходного кода.
🟠Это решает проблему модификации поведения без нарушения принципа открытости/закрытости (SOLID).
🟠Удобен для добавления динамических изменений, таких как логирование, кэширование или аутентификация.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Чем composer.json отличается от composer.lock?

🟠composer.json: содержит список зависимостей проекта и их версии (диапазоны).
🟠composer.lock: фиксирует конкретные версии зависимостей, установленных в проекте, для воспроизводимого окружения.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой метод используется для удаления куки в PHP?
Anonymous Quiz
33%
remove_cookie()
11%
delete_cookie()
33%
unset_cookie()
22%
setcookie()
#полезное
🛞 Выжимаем максимум скорости из PHP

На Хабр вышла интересная статейка о методах оптимизации производительности PHP-приложений. Речь идёт о технологиях CGI, Apache с mod_php, связка Apache и Nginx, а также PHP-FPM и PHP-PM.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой метод используется для изменения прав доступа к файлу в PHP?
Anonymous Quiz
20%
set_mode()
13%
file_chmod()
0%
change_mode()
67%
chmod()
🤔 Какой метод используется для получения информации о типе ресурса в PHP?
Anonymous Quiz
44%
get_resource_type()
38%
resource_type()
0%
type_resource()
19%
get_type_resource()
#ЛитКод
Задача: 605. Can Place Flowers

У вас есть длинная клумба, на которой некоторые участки засажены, а некоторые нет. Однако цветы нельзя сажать на соседних участках.

Дан целочисленный массив flowerbed, содержащий 0 и 1, где 0 означает пустой участок, а 1 — занятый участок, и целое число n. Верните true, если n новых цветов можно посадить на клумбе, не нарушая правила о соседних цветах, и false в противном случае.

Пример
Input: flowerbed = [1,0,0,0,1], n = 1
Output: true


👨‍💻 Алгоритм:

1⃣Решение очень простое. Мы можем определить максимальное количество дополнительных цветов, count, которые можно посадить для данного расположения клумбы. Для этого мы проходим по всем элементам массива flowerbed и находим те элементы, которые равны 0 (означает пустую позицию).

2⃣Для каждого такого элемента проверяем, пусты ли обе его соседние позиции. Если да, мы можем посадить цветок в текущей позиции, не нарушая правило соседних цветов. Для первого и последнего элементов не нужно проверять предыдущие и следующие соседние позиции соответственно.

3⃣Если полученное количество count больше или равно n, требуемому количеству цветов для посадки, мы можем посадить n цветов на пустые места, иначе - нет.

😎 Решение:
class Solution {
function canPlaceFlowers($flowerbed, $n) {
$count = 0;
for ($i = 0; $i < count($flowerbed); $i++) {
if ($flowerbed[$i] == 0) {
$emptyLeft = $i == 0 || $flowerbed[$i - 1] == 0;
$emptyRight = $i == count($flowerbed) - 1 || $flowerbed[$i + 1] == 0;
if ($emptyLeft && $emptyRight) {
$flowerbed[$i] = 1;
$count++;
}
}
}
return $count >= $n;
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM