PHP newbie | bukachuk
159 subscribers
1 photo
16 links
Канал о PHP, Linux, Mysql, Web

Youtube канал: https://www.youtube.com/@bukachuk_php

Друг друга не оскорбляем, не хулиганим!
Вопросы, пожелания оставляем в комментариях!
Download Telegram
Channel name was changed to «PHP newbie»
⚡️Пожалуйста не флудите в комментариях и не оскорбляйте других участников! Виновные будут всю жизнь программировать на джумле! 🤡🤡
PHP newbie | bukachuk pinned «⚡️Пожалуйста не флудите в комментариях и не оскорбляйте других участников! Виновные будут всю жизнь программировать на джумле! 🤡🤡»
Channel name was changed to «PHP newbie | bukachuk»
https://www.youtube.com/watch?v=cNFKo0rQ5Vk
Видео скорее для программистов уровня middle и выше, но новички тоже могут посмотреть, возможно в будущем с этим придется столкнуться, про то как добавить колонку или изменить в большой таблице mysql на рабочем проекте, особенно когда требование - не положить прод базу и не останавливать текущие процессы. Смоделировал возможные ситуации и варианты выхода из них.
Вопрос с собеседования на PHP разработчика.

Что будет выводом программы?
Здесь вопрос на умение читать код. Middle/Senior должен дать ответ в несколько секунд.

$a = 5;
$a = $a ?: 3;
echo $a;

Очень часто говорят о том, что не видели такой записи никогда, что конечно же является не очень хорошим сигналом.

По сути это краткая запись тернарного оператора, просто после ? знака нужно продублировать $a,
то есть будет $a = $a ? $a : 3; - то есть когда у вас есть дублирование условия и первого результата, результат можно опустить.

Читается такой оператор просто, если $a -> true то $a иначе 3, в итоге ответ здесь - 5.
Что значит ошибка 504 Gateway Timeout

Ошибка 504 Gateway Timeout означает, что сервер, выполняющий роль шлюза или прокси (в нашем случае это обычно NGINX), не получил своевременный ответ от вышестоящего сервера, к которому он обращался для выполнения запроса.

Если простыми словами, запрос сначала приходит на NGINX, далее передается в PHP-FPM, который запускает PHP код и выполняет его, так вот если данный код работает дольше, чем timeout ожидания ответа, выставленный в nginx, мы получаем данную ошибку. Обычно по умолчанию таймаут выставлен в 30 сек. В NGINX это выставляется в секции location - fastcgi_read_timeout 30;

Какие могут быть причины данного явления:

1. Перегрузка сервера, который может быть перегружен запросами и не успевает обработать все входящие запросы своевременно (нужно как минимум глянуть htop на сервере).

2. Проблемы с кодом PHP, например обращение на внешний сервис по HTTP протоколу, который в данный момент лежит, как пример - стягивание курсов валют с сайта ЦБ. Клиент обратился к нашему сайту, PHP пошел за курсами ЦБ c помощью CURL с высталенным таймаутом 30 сек. как обычно, не дождался ответа за 30 сек. тк удаленный сервер лежит, в этом время ожидания у nginx истекло, он выдал 504.

3. Слишком низкое значение таймаута выставленное в nginx по ошибке (поставили 5 сек. но в нагрузочное время этого оказалось мало)

4. PHP-FPM просто не работает на сервере тк упал по какой-то причине (нужно пойти на сервер проверить - sudo systemctl status nginx.service

Какие варианты решения:

1. Настроить таймауты (в nginx и PHP-FPM): Проверить и при необходимости увеличить значения таймаутов в nginx. Можно ли увеличивать его в потолок? И да и нет. Если причина в высокой нагрузке, это только усугубит ситуацию. Тк работает это так, допустим у PHP-FPM выставленно максимальное значение процессов (max_children)- 200, подключились 200 клиентов, 200 запросов, часть их них успела отработать, часть продолжает выполняться, тк сервер пригружен. В случае с правильным таймаутом их просто в итоге сбросит с линии и подключаться другие клиенты, то есть сервис будет доступен, но частично. В случае же увеличении таймаута, они все будут оставаться на линии еще большее время, нагрузка будет расти, остальные клиенты будут ожидать в очереди, в итоге серверу станет еще хуже, пострадавших клиентов станет больше, очень часто в такой ситуации сервер просто ложится намертво.

2. Разобраться с PHP кодом, если в нем какая-то сложная логика, которую нельзя легко ускорить, как вариант, вынести данные операции в очередь (RabbitMQ, Redis, etc.). Если нагрузка в целом небольшая, можно временно увеличить таймаут например на 60 сек. а далее заняться решением основной проблемы (мы просто выиграем время)

3. Посмотреть в целом настройки PHP-FPM, тк там есть, что подкрутить. Подключить OPCACHE если он не подключен, он даст прирост скорости PHP
⚡️ Самая главная ошибка начинающих разработчиков

Вы можете найти много историй, про ошибки начинающих, с кучей пунктов, но главный на деле в этом списке один.
И так, вы решили научиться программированию, открыли интернет, купили курс, смотрите Youtube, это неважно. Ответьте себе на один простой вопрос - сколько вы сделали проектов от начала до конца, пускай даже небольших?

Очень часто ответ здесь - ноль. В этом и есть главная проблема и ошибка, тк. чтобы научиться любому делу, пусть это лечить людей, водить машину, нужна практика и только практика. Причем много практики, как можно больше.

В ИТ как правило работает простое правило - гладко было на бумаге, да забыли про овраги. Вы смотрите видеоурок или читаете статью, вам вроде все ясно и понятно, но как только вы начинаете даже повторять тоже самое, а более того, пытаетесь сделать немного иначе, у вас возникают разные сложности. Причем это правило работает и для программистов со стажем, я вчера сидел в Jenkins настраивал деплой, и пол часа втыкал в экран, а на деле просто описался в названии переменной. Поэтому вам нужна практика и еще раз практика. Плюс ко всему программирование - это не только знание языка, это и быстрая печать на клавиатуре, умение читать ошибки на английском языке, умение правильно искать ответ на свой вопрос в Google и еще много все, и все эти навыки вместе вы получите только практикой. Плюс само гугление проблемы и чтение форумов наполняет вас теории само по себе.

Что же в итоге делать?

Берете любую понравившуюся идею, тут не стоит утопать в думках на несколько дней, тк это не сильно важно. Самые простые варианты: блог статей, доска объявлений, доска объявлений автомобилей, доска объявлений недвижимости.

Последние примеры по мне так вообще идеальные, тк там прорабатываются основные моменты веб программирования, плюс много разных полей характеристик объекта итд. Далее берете любой первый попавшийся дизайн шаблон и начинаете делать. Долго упорно и нудно, не отвлекаясь на разные медиа итд.

Не гнаться за перфекционизмом

Не надо переживать на начальном этапе, что вы сделаете что-то не так, тк всем на это будет пофиг. Вам нужно просто любыми силами и способами сделать рабочий сайт, который будет предоставлять какой-то функционал.

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

Далее берете сдедующий проект и делаете его уже лучше и сложнее, пусть с вкраплениями ООП и composer. Следующий шаг тоже самое на фреймворке.
⚡️ Вопрос с собеседования на PHP разработчика.

Что будет выводом программы?

$id = 4;
if ($id = 2) $id = 3;
echo $id;

Ответ будет позже в комментариях, можете ответить сами, только не запускать код)
Декомпозиция задач

Декомпозиция задач — это процесс их разделения на отдельные небольшие шаги (подзадачи). Делается это прежде всего для упрощения процесса разработки и контроля выполненных задач.

Например вам нужно сделать регистрацию пользователя, авторизацию и выход из системы и страницу редактирования его профиля. Вы можете это сделать в один приход, но проблема здесь во первых возникает в процессе оценки сроков задачи плюс как правило такой pull реквест (запрос на внесение изменений в ветку master/main) будет содержать в себе много изменений, что усложнит процесс review кода (когда ваш код смотрит и проверяет другой программист) как для ревьюера (вашего тим лида например), так и для исполнителя, тк правок может быть после ревью много и не одна итерация.

Поэтому эту задачу можно разбить на подзадачи.

1. Делаем регистрацию
2. Делаем авторизацию пользователя и выход
3. Делаем страницу редактирования профиля пользователя

Плюс данный подходят позволяет минимализировать шансы "все сломать", тк небольшие куски кода легче контролировать. Вы можете даже пушить в репозиторий код, который не будет вообще запускаться на проде и это вполне себе нормально,

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

Кто должен делать декомпозицию?

Декомпозицией задачи занимаются специалисты по проектному управлению, аналитики, а также менеджеры проектов. Этот процесс также могут выполнять разработчики программного обеспечения и инженеры (то есть вы) или ваш тимлид, когда речь идет о технических проектах
Присваивание в if условии

Допустим есть такой код:

if ($request = $this->getRequest()) {
// здесь какая-то логика
}

Это называется присваивание под условием, альтернатива такому коду

$request = $this->getRequest();
if ($request) {
// здесь какая-то логика
}

Такая практика считается не самой лучшей, хотя это вопрос спорный. Тк первый вариант позволяет немного сократить код на одну строку и когда таких условий много, это становится весомым.

Какие минусы данного подхода:

1. Присваивание в условии может сделать код трудным для чтения и понимания. Читателю кода будет сложнее сразу понять, что происходит, поскольку переменные неявно изменяются в самом условии.
2. Легко случайно написать оператор присваивания = вместо оператора сравнения ==. Это приведет к логическим ошибкам, которые могут быть трудноуловимыми.
3. Присваивание внутри условия может привести к неожиданным побочным эффектам, так как переменная изменяет свое значение в месте, где это не ожидается. Это может затруднить отладку и понимание поведения программы.

Какой вариант выбирать - решать вам. Мне например эти аргументы против кажутся совсем притянутые, кроме наверное первого, тк ответ на них простой - читай код внимательно)
⚡️Когда планируется выпуск PHP 8.4? ⚡️

Выпуск PHP 8.4 запланирован на 21 ноября 2024 года.
Что будет интересного (здесь конечно не полный список всех изменений):

1. Новый MyClass()->method() без скобок

Будет так (вокруг созданного объекта не нужны будут скобки)
$request = new Request()->withMethod('GET'));

Сейчас это так (скобки вокруг создания объекта и это действительно напрягает, кстати чтобы так можно было вызывать методы цепочкой, нужно в методе возвращать return $this):
$request = (new Request())->withMethod('GET');

2. Создать DateTime из временной метки Unix

$dateTime = DateTimeImmutable::createFromTimestamp(1718337072);
$dateTime->format('Y-m-d'); // 2024-06-14

3. Новые функции для работы с массивом

array_find($array, function (string $value)) - вторым аргументом будем передавать замыкание, которое ищет нужное и возвращает true если нашли

array_find_key($array, function (string $key)) - здесь аналогично, только искать будет ключ массива

array_any($array, function (string $value)) - будет проверять, что хотя бы один элемент соответствует условию проверки в замыкании, сама функция возвращает bool

array_all($array, function (string $value)) - здесь будет проверять, что все элементы соответствуют условию в замыкании (замыкание возращает bool), сама функция возвращает bool

4. Новые mb_ функции для работы с мультибайтовыми кодировками (то есть русские буквы например в UTF-8)

Проблема здесь возникает, что обычные trim и другие функции неправильно работают с UTF-8 и выдают ложные результаты, поэтому в PHP нужно использовать mb_ функции, но их список был не полный. Новые функции (их текущие аналоги без приставки mb_):

mb_trim
mb_ltrim
mb_rtrim
mb_ucfirst
mb_lcfirst

5. Хуки для свойств класса

Если упрощенно, то можно будет в классе определить хук на какое-либо свойство и присваивании этому значению, будет выполнена логика хука.
Сейчас без этого вам нужно пискать логику в сеттерах например:

public function setFullname(string $name, string $surname): void
{
$this->fullname = $name . ' ' . $surname;
$this->name = $name;
$this->surname = $surname;
}

Более подробно с примерами здесь:

https://wiki.php.net/rfc/property-hooks
Использование разных версий PHP по миру. Почему так много старых версий? Все просто, многим компаниям, особенно с историей, достаточно дорого и сложно сменить версию на следующую и чем выше разрыв между версиями, тем труднее. В продуктовой разработке это может занять вплоть до года, а то и больше, если такая цель поставлена. Если версия PHP в компании старая - это вовсе не значит, что в ней плохо с разработкой, это скорее значит, что компания давно на рынке и в кодовой базе достаточно легаси.
PHP умирает, зачем его изучать?

Это любимая байка в интернете, которой уже, наверное, более 15 лет. Я использую PHP более 20 лет, и все это время фоном была данная история, что вот-вот он умрет. На деле язык хорошо продвинулся в развитии, улучшилась производительность, поддержка ООП и т.д. Хороший толчок этой истории дал выход Ruby on Rails и Django на Питоне на рынок. Лет 10 назад каждая вторая статья в сети была о том, какой же PHP плохой, и что все должны переходить на рельсы.

В итоге где сейчас Ruby on Rails? Поэтому не нужно переживать, что вы выучите какую-то умирающую технологию, как PHP, так как он не умирает.

Даже если мы гипотетически представим, что завтра PHP начнет умирать, это тоже не проблема. Так как сама по себе backend-разработка состоит не только из языка программирования сегодня, это и очереди, базы данных, in-memory базы данных и многое другое. Поэтому перейти на другой backend-язык, если вы программируете уже пару лет на одном языке, будет несложно.

Исследование w3Techs на 2024 год показывает 76% использование PHP https://w3techs.com/technologies/overview/programming_language
Нюансы использование ссылок в циклах

Допустим есть такой код (к каждому элементы массива прибавляем 1)
На выходе будет массив:
[2, 3, 4, 5, 6];

То есть при передаче по ссылке внутри foreach (знак амперсанта & перед $number) вы будете менять значение именно в массиве, а не новой переменной $number
После цикла стоит сделать unset($number); тк если вы это не сделаете, то при использовании $number снова, вы измените последний элемент массива

<?php

$numbers = [1, 2, 3, 4, 5];
foreach ($numbers as &$number) {
$number++;
}
unset($number); // Здесь стоит так делать, чтобы избежать повторное использование ссылки на последний элемент массива

$number = 10; // Здесь, если не будет unset, который выше, вы измените последний элемент массива numbers, и вместо 6 будет 10, тк здесь идет ссылка на последний элемент массива, а не его значение
Используйте единый стиль кодирования

Использование единого стиля кодирования во всей кодовой базе облегчает чтение и понимание.

PHP имеет ряд стандартов кодирования, таких как PSR-1 и PSR-2, которые предоставляют набор рекомендаций по стилю кодирования для PHP, направленных на установление общего стандарта кодирования для проектов и разработчиков. Основные правила, предписанные PSR-2 (старая версия) и PSR-12 (обновленная), включают:

1. Отступы: в коде для отступов необходимо использовать 4 пробела, а не табуляции, что обеспечивает единообразное и читабельное форматирование кода.
2. Декларации пространства имен и использования: После декларации пространства имен и каждой группы операторов использования должна быть пустая строка.
3. Скобки классов и методов: Открывающая скобка для классов и методов должна быть на той же строке, а закрывающая скобка должна быть на новой строке. Методы и свойства внутри класса должны быть разделены пустой строкой.
4. Видимость методов: видимость методов (например, публичных, закрытых, защищенных) должна быть объявлена ​​явно.
5. Закрывающая фигурная скобка управляющей структуры: Закрывающая фигурная скобка для управляющих структур (if, else, for, while и т. д.) должна находиться на той же строке, что и ключевое слово control.
6. Вызовы методов и функций: между именем метода или функции и открывающейся скобкой не должно быть пробела, а также не должно быть пробела перед закрывающейся скобкой.
7. Аргументы метода: В аргументах метода не должно быть пробелов перед открывающейся скобкой и после закрывающейся скобки. Также не должно быть пробелов после запятых в списках аргументов.
8. Объявление массива: Массивы должны объявляться с использованием короткого синтаксиса ([]), а не традиционного синтаксиса (array()).
9. Одинарные и двойные кавычки: строки могут быть заключены в одинарные или двойные кавычки, но выбранный стиль должен быть единообразным во всей кодовой базе.
10. Конкатенация: при конкатенации строк используйте пробел до и после оператора .

Соблюдение этих стандартов может помочь обеспечить единообразие вашего кода. Также вы можете подключить CS-Fixer как к своей IDE так и к хуку git перед commit который будет проверять это автоматически https://github.com/PHP-CS-Fixer/PHP-CS-Fixer

Официальная документация PSR-12 с примерами правильного оформления кода https://www.php-fig.org/psr/psr-12/
Please open Telegram to view this post
VIEW IN TELEGRAM