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

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

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

Для связи: @ruslan_kuyanets
Download Telegram
#ЛитКод
Задача: 621. Task Scheduler

Вам дан массив задач процессора, каждая из которых представлена буквами от A до Z, и время охлаждения, n. Каждый цикл или интервал позволяет завершить одну задачу. Задачи могут быть выполнены в любом порядке, но есть ограничение: одинаковые задачи должны быть разделены не менее чем n интервалами из-за времени охлаждения. Верните минимальное количество интервалов, необходимое для выполнения всех задач.

Пример:
Input: tasks = ["A","A","A","B","B","B"], n = 2
Output: 8


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

1⃣Подсчитайте количество каждой задачи и найдите максимальное количество вхождений (maxFreq).

2⃣Вычислите количество интервалов, необходимых для задач с maxFreq: (maxFreq - 1) * (n + 1) + countMaxFreq, где countMaxFreq - количество задач, имеющих maxFreq.

3⃣Верните максимум между вычисленным значением и длиной массива задач, поскольку некоторые задачи могут заполнять интервал до n.

😎 Решение:
function leastInterval($tasks, $n) {
$taskCounts = array_count_values($tasks);
$maxFreq = max($taskCounts);
$countMaxFreq = count(array_filter($taskCounts, function($count) use ($maxFreq) {
return $count == $maxFreq;
}));

return max(count($tasks), ($maxFreq - 1) * ($n + 1) + $countMaxFreq);
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какую функцию использовать для установки пользовательского имени сессии?
Anonymous Quiz
9%
rename_session()
9%
change_session_name()
48%
set_session_name()
35%
session_name()
Media is too big
VIEW IN TELEGRAM
#полезное
😊 Генерация документации по API

Если вы ищете самый простой способ сгенерировать документацию по API для вашего приложения на Laravel, которая также будет красивой, попробуйте следующее:

1⃣Установите Scribe через Composer (knuckleswtf/scribe) Это генератор документации API, который использует ваши маршруты, запросы, модели и ресурсы для автоматической генерации.

2⃣Настройте вывод Scribe Установите параметры конфигурации scribe.type в значение 'external_laravel' и scribe.theme в значение 'scalar'.

3⃣Запустите команду php artisan scribe:generate

Вы получаете массу возможностей бесплатно, включая автоматическую генерацию примеров на различных языках программирования, светлый/тёмный режим, поиск, версионность и многое другое.
Читать статью

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как РНР обрабатывает несколько запросов?

PHP обрабатывает запросы изолированно, создавая новый процесс или поток для каждого запроса, в зависимости от конфигурации сервера. Например, Apache с модулем mod _php использует модель мультипроцессов, а PHP-FPM (FastCGI Process Manager), часто используемый с Nginx, использует пул процессов для обработки запросов. Эти процессы работают независимо, и каждый запрос не влияет на другие.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какую функцию использовать для экранирования данных для безопасного использования в HTML-контексте?
Anonymous Quiz
14%
addslashes()
10%
htmlentities()
55%
htmlspecialchars()
21%
strip_tags()
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
😊 Расширение для Chrome

Онопозволяет встраивать PHP-консоль в панель разработчика DevTools. Оно использует пакет Spatie Laravel Web Tinker и встраивает его в панель инструментов, предоставляя доступ к консоли PHP прямо внутри DevTools.

Установка:
🟠Скачайте и распакуйте проект.
🟠Перейдите по адресу chrome://extensions/ в вашем браузере.
🟠Включите "Режим разработчика" в правом верхнем углу (если он еще не включен).
🟠Нажмите "Загрузить распакованное расширение" и выберите папку php-ext.
🟠В вашем Laravel проекте установите пакет Spatie Laravel Web Tinker командой:
composer require spatie/laravel-web-tinker


Теперь в панели консоли Chrome появится новая вкладка PHP. Кликнув по ней, вы получите доступ к PHP консоли, где сможете выполнять код Laravel или PHP прямо из браузера
Смотреть расширение

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Вакансии
👨‍💻 Программист PHP/ Laravel/ Vue.js

Локация: Удаленно
Компания: What'sOnPic
ЗП: до 200 000 р.
Занятость: Проектная
Мы - динамично развивающаяся компания с открытой и прозрачной корпоративной культурой. Мы ценим простоту, честность и конкретику в общении и работе.

🚩Требования
🔵 Мы ищем программиста для работы над существующими и новыми SPA-проектоми, построенными на стеке LAMP. Проект использует PHP 8.2, Laravel 10 и Vue.js 3.3. Это проектная работа, предполагающая удаленную работу не менее 30 часов в неделю. Вы будете работать напрямую с руководителем проекта.
🔵 Важными являются способность самостоятельно принимать решения и решать проблемы.
🔵 Опыт работы над подобными проектами будет большим преимуществом.

🚩Условия работы
🟡 Мы предлагаем гибкий график работы и возможность работать удаленно. Наша цель - создать условия, при которых каждый сотрудник сможет проявить себя и достичь успеха в своей работе. Пожалуйста, обратите внимание, что мы не предлагаем социальные пакеты, оплачиваемые отпуска или корпоративные мероприятия. Это проектная работа, и условия будут обсуждаться индивидуально с каждым кандидатом.

📩 Резюме отправлять: whatsonpic.ico@gmail.com

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как можно улучшить производительность PHP-приложения?

Для улучшения производительности используйте кеширование (например, Opcache), минимизируйте сложность запросов к базе данных с помощью индексации и подготовленных запросов, а также обновляйте РНР до последней версии. Сократите использование тяжёлых библиотек, оптимизируйте работу с файлами и используйте CDN для загрузки статического контента.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой метод используется для получения всех свойств объекта в виде массива?
Anonymous Quiz
41%
getProperties()
44%
get_object_vars()
5%
getVars()
10%
fetchProperties()
#ЛитКод
Задача: 639. Decode Ways II

Сообщение, содержащее буквы от A-Z, может быть закодировано в цифры с помощью следующего отображения: 'A' -> "1" 'B' -> "2" ... 'Z' -> "26" Чтобы декодировать закодированное сообщение, все цифры должны быть сгруппированы, а затем снова преобразованы в буквы с помощью обратного отображения (может быть несколько способов). Например, "11106" может быть преобразовано в: "AAJF" с группировкой (1 1 10 6) "KJF" с группировкой (11 10 6) Обратите внимание, что группировка (1 11 06) недействительна, поскольку "06" не может быть преобразовано в "F", так как "6" отличается от "06". В дополнение к вышеуказанным преобразованиям кодированное сообщение может содержать символ "*", который может представлять любую цифру от "1" до "9" ("0" исключается). Например, кодированное сообщение "1*" может представлять любое из кодированных сообщений "11", "12", "13", "14", "15", "16", "17", "18" или "19". Декодирование "1*" эквивалентно декодированию любого из кодированных сообщений, которые оно может представлять. Если задана строка s, состоящая из цифр и символов '*', верните количество способов ее декодирования. Поскольку ответ может быть очень большим, верните его по модулю 109 + 7.

Пример:
Input: s = "*"
Output: 9


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

1⃣Инициализация
Создайте массив dp, где dp[i] представляет количество способов декодирования подстроки s[0:i]. Установите начальные значения dp[0] = 1 (пустая строка имеет один способ декодирования).

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

3⃣Модульное вычисление
Поскольку количество способов декодирования может быть большим, вычисляйте результаты по модулю 10^9 + 7.

😎 Решение:
function numDecodings($s) {
$MOD = 1000000007;
$n = strlen($s);
$dp = array_fill(0, $n + 1, 0);
$dp[0] = 1;

for ($i = 1; $i <= $n; $i++) {
if ($s[$i - 1] == '*') {
$dp[$i] = 9 * $dp[$i - 1];
} else if ($s[$i - 1] != '0') {
$dp[$i] = $dp[$i - 1];
}

if ($i > 1) {
if ($s[$i - 2] == '*') {
if ($s[$i - 1] == '*') {
$dp[$i] += 15 * $dp[$i - 2];
} else if ($s[$i - 1] >= '0' && $s[$i - 1] <= '6') {
$dp[$i] += 2 * $dp[$i - 2];
} else {
$dp[$i] += $dp[$i - 2];
}
} else if ($s[$i - 2] == '1') {
if ($s[$i - 1] == '*') {
$dp[$i] += 9 * $dp[$i - 2];
} else {
$dp[$i] += $dp[$i - 2];
}
} else if ($s[$i - 2] == '2') {
if ($s[$i - 1] == '*') {
$dp[$i] += 6 * $dp[$i - 2];
} else if ($s[$i - 1] >= '0' && $s[$i - 1] <= '6') {
$dp[$i] += $dp[$i - 2];
}
}
}

$dp[$i] %= $MOD;
}

return $dp[$n];
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой параметр функции setcookie() указывает путь, на котором куки будут доступны?
Anonymous Quiz
56%
path
34%
domain
5%
secure
5%
httpOnly
#Собес
🤔 Как работают сессии в РНР?

Сессия - это механизм сохранения данных между запросами. При запуске сессии сервер генерирует уникальный идентификатор (ID), который хранится в сооkіе или передаётся через URL. Сервер сохраняет данные сессии на стороне сервера, а клиент использует идентификатор для доступа к этим данным.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
#полезное
😊 Развертывание PHP-приложения с помощью docker compose в продакшн

Подробно объясняется настройка окружения, конфигурация Docker Compose для PHP-приложения и процесс его деплоя на GCP
Читать статью

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какую функцию использовать для записи массива в файл в формате CSV?
Anonymous Quiz
19%
putcsv()
30%
writecsv()
37%
fwritecsv()
15%
fputcsv()
#вакансии
👨‍💻 PHP Backend Developer (от middle+)

Локация: Удаленно
Компания: Aльтернатива
ЗП: до 1 700 р./час
Занятость: Частичная

Альтернатива - полностью территориально распределенная компания. Мы занимаемся как собственными продуктами, так и заказной разработкой. В нашем портфолио классические ИС под заказ для крупных клиентов, мелкие сайты для малого бизнеса, мобильные приложения, а также web3 проекты.

🚩Ожидания
🔵 PHP8, SQL;
🔵 Опыт разработки REST API и JSON;
🔵 Работа с Git;
🔵 Уметь планировать и оценивать свою работу;
🔵 Обязательно знание Laravel или Битрикс БУС.

Чем предстоит заниматься
🔵 Поддерживать существующие проекты;
🔵 Разрабатывать новые проекты самостоятельно или в команде.

🚩Условия
🟡 Полная удаленка;
🟡 Возможность гибкого времени работы;
🟡 Оформление через самозанятого или ИП.

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

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 В чем разница между методами GET и POST?

Метод GET используется для получения данных, а POST - для их отправки на сервер. Данные GET
передаются через URL, a POST - в теле запроса. GET запросы кэшируются и могут быть сохранены в
истории браузера, тогда как POST запросы более защищены для передачи данных.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какую функцию использовать для сортировки массива с помощью пользовательской функции сравнения?
Anonymous Quiz
58%
usort()
6%
uksort()
6%
uasort()
29%
array_multisort()
#ЛитКод
Задача: 642. Design Search Autocomplete System

Разработайте свою реализацию круговой двусторонней очереди (deque). Реализуйте класс MyCircularDeque: MyCircularDeque(int k) Инициализирует deque с максимальным размером k. boolean insertFront() Добавляет элемент в переднюю часть Deque. Возвращает true, если операция прошла успешно, или false в противном случае. boolean insertLast() Добавляет элемент в заднюю часть Deque. Возвращает true, если операция выполнена успешно, или false в противном случае. boolean deleteFront() Удаляет элемент из передней части Deque. Возвращает true, если операция прошла успешно, или false в противном случае. boolean deleteLast() Удаляет элемент из задней части Deque. Возвращает true, если операция прошла успешно, или false в противном случае. int getFront() Возвращает передний элемент из Deque. Возвращает -1, если Deque пуст. int getRear() Возвращает последний элемент из Deque. Возвращает -1, если Deque пуст. boolean isEmpty() Возвращает true, если Deque пуст, или false в противном случае. boolean isFull() Возвращает true, если Deque полон, или false в противном случае.

Пример:
Input
["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
[[3], [1], [2], [3], [4], [], [], [], [4], []]
Output
[null, true, true, true, false, 2, true, true, true, 4]


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

1⃣Инициализация и проверка состояний
Реализуйте конструктор для инициализации кольцевой двусторонней очереди заданного размера и методы для проверки пустоты и полноты очереди.

2⃣Операции вставки
Реализуйте методы вставки элементов в переднюю и заднюю части очереди с учетом кольцевой структуры.

3⃣Операции удаления
Реализуйте методы удаления элементов из передней и задней частей очереди с учетом кольцевой структуры и методы для получения переднего и заднего элементов очереди.

😎 Решение:
class TrieNode {
public $children;
public $count;

public function __construct() {
$this->children = [];
$this->count = [];
}
}

class AutocompleteSystem {
private $root;
private $prefix;

function __construct($sentences, $times) {
$this->root = new TrieNode();
$this->prefix = "";
for ($i = 0; $i < count($sentences); $i++) {
$this->add($sentences[$i], $times[$i]);
}
}

private function add($sentence, $count) {
$node = $this->root;
for ($i = 0; $i < strlen($sentence); $i++) {
$char = $sentence[$i];
if (!isset($node->children[$char])) {
$node->children[$char] = new TrieNode();
}
$node = $node->children[$char];
if (!isset($node->count[$sentence])) {
$node->count[$sentence] = 0;
}
$node->count[$sentence] += $count;
}
}

function input($c) {
if ($c == '#') {
$this->add($this->prefix, 1);
$this->prefix = "";
return [];
}

$this->prefix .= $c;
$node = $this->root;
for ($i = 0; $i < strlen($this->prefix); $i++) {
$char = $this->prefix[$i];
if (!isset($node->children[$char])) {
return [];
}
$node = $node->children[$char];
}

$pq = [];
foreach ($node->count as $sentence => $count) {
$pq[] = [$sentence, $count];
}

usort($pq, function($a, $b) {
if ($a[1] == $b[1]) {
return strcmp($a[0], $b[0]);
}
return $b[1] - $a[1];
});

$result = [];
for ($i = 0; $i < min(3, count($pq)); $i++) {
$result[] = $pq[$i][0];
}

return $result;
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какую функцию использовать для чтения значения куки с указанием всех параметров куки (например, путь, домен, срок действия)?
Anonymous Quiz
52%
get_cookie_params()
24%
read_cookie_params()
24%
session_get_cookie_params()
0%
fetch_cookie_params()
#Собес
🤔 Как предотвратить SQL-иньекции в РНР-приложениях?

SQL-иньекций можно избежать, используя подготовленные запросы с PDO или MySQLi, которые отделяют данные от SQL-кода. Также важно валидировать и фильтровать пользовательский ввод, ограничивать права доступа к базе данных, использовать современные инструменты для работы с базой и обновлять программное обеспечение.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Карточка состояния базы данных для Laravel Pulse

Разработчик Джейми Схоутен создал изящную карту Laravel Pulse для мониторинга состояния вашей базы данных, предоставляя ключевые показатели, такие как активные потоки, соединения и многое другое

Эта конфигурация карты поддерживает настройку нескольких баз данных, и вы можете указать, какие типы данных включать.
Гитхаб

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