Сервер и структура проекта

Сегодня подготовим всю необходимую инфраструктуру. Установим и настроим локальный HTTP-сервер Nginx c PHP-FPM в Docker. А потом определим структуру файлов и директорий проекта для написания наших классов. Сделаем автозагрузку классов для фреймворка и демо-приложения с помощью Composer. Для тестирования установим PHPUnit и напишем свой первый тест. И заодно настроим интеграцию PHP и запуска тестов в PHPUnit.

  • 00:01:29 Демонстрационная HTML-страница
  • 00:02:05 Настройка табуляции с editorconfig
  • 00:06:58 Недостатки ручной установки
  • 00:08:03 Использование виртуализации
  • 00:10:13 Использование контейнеров
  • 00:13:26 Запуск процессов через Docker
  • 00:18:11 Создание своего образа с Nginx
  • 00:20:51 Работа с Docker Compose
  • 00:23:05 Установка PHP-FPM
  • 00:26:52 Упрощение запуска в терминале
  • 00:28:56 Философия одного процесса
  • 00:30:58 Консольный процесс PHP-CLI
  • 00:32:45 Переопределение пользователя
  • 00:35:30 Установка Composer
  • 00:39:38 Инициализация проекта
  • 00:40:37 Сортировка зависимостей
  • 00:40:55 Интеграция PHP в PhpStorm
  • 00:43:37 Структура исходного кода
  • 00:44:40 Автозагрузка классов проекта
  • 00:47:14 Подключение PHPUnit
  • 00:49:19 Донастройка тестов
  • 00:51:23 Подключение автозагрузчика
  • 00:51:58 Пробный класс и тест
  • 00:54:07 Команда запуска тестов
  • 00:55:13 Запуск тестов в PhpStorm
  • 00:56:48 Общепринятый Code Style
  • 00:59:33 Установка PHP CS Fixer
  • 01:02:56 Команды запуска
  • 01:04:57 Запуск Composer из Docker в PhpStorm
  • 01:06:36 Статический анализ кода
  • 01:07:46 Использование Psalm
  • 01:10:12 Автопроверка в PhpStorm
  • 01:12:43 Обзор результата
Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (33)
Андрей

Спасибо!

Ответить
Руслан

Спасибо!

Ответить
v

Крутой урок!

Ответить
Александр

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

Ответить
Фарух

Дабавьте лайки. Хочется поставить лайк но нет такой возможности :) :)

Ответить
slo_nik

Доброе утро.

Самый лучший "лайк" это написать словами благодарность Дмитрию.

p.s. Что вы, в самом деле, как неандертальцы!!! Что, без "наскальной" живописи никак не можете выразить свои мысли?

Ответить
Фарух

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

Ответить
fedot

Не лайки а линк доната, куда можно ливануть бабла в багодарность, К тому же надо учитывать, что реализация нового функционала, отнимет время от уроков, которые и так не особо часто выходят, поэтому не стоит отвлекать Диму всякой не нужной хернёй. Спасибо, за урок Дима.

Ответить
Алексей

Спасибо большое, ждём следующих эпизодов.

Ответить
Дмитрий

С нетерпением жду продолжения именно этого проекта...

Ответить
maxbrown1

Шикарный урок!

Ответить
slo_nik

Дмитрий, как всегда урок прекрасен.

Благодарю.

Ответить
Nik

Видео: 0:49 "В этом проекте мы не будем с вами рассматривать разные асинхронные вещи. И вместо этого будем использовать классическую связку из веб-сервера nginx и отдельно запущенного менеджера php-процессов php-fpm"

Интересно, о каких асинхронных вещах говорится? Что можно использовать вместо связки nginx + php-fpm?

Ответить
Дмитрий Елисеев

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

В сложном случае можно построить полностью асинхронное приложение на асинхронных пакетах вроде Swoole, ReactPHP и AmPHP.

Ответить
Игорь

Спасибо вам, Дмитрий и Юлия! Понятно разобрана настройка докера и запуск контейнеров.

Ответить
Евгений

Спасибо!

Ответить
Ринат

Не могу победить. Версия композер 2.3.5

docker-compose run --rm php-cli composer init

На этапе установки зависимости для PHP

Enter the version constraint to require (or leave blank to use the latest version): 

In BaseCommand.php line 304:
                                                                                                                                  
  [LogicException]                                                                                                                
  Calling getPlatformRequirementFilter from a command which does not define the --ignore-platform-req[s] flags is not permitted.

Нашел что они тут правили это.

Но так и не понял почему не работает. Если речь про install - то мы же его не устанавливаем чтобы передать параметр --ignore-platform-reqs. А просто копируем

COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer

Вообщем не понимаю как победить

Ответить
Дмитрий Елисеев

Это только в версии 2.3.5 или ещё и в других? Если только в этой, то можно попробовать другую:

--from=composer:2.3.4
Ответить
Максим

Вот не сработала почему-то эта магия с RUN addgroup
Потому что на composer install выдавало ошибку:

/app/vendor does not exist and could not be created.

Пришлось закомментить
USER app
чтобы композер устанавливал всё необходимое.

А, и почему-то ругалось на версию в docker-compose.yml
2.9 ему не нравилось, а вот 3.0 в самый раз. Вот сам текст ошибки:

"ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1. For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/"
Ответить
Дмитрий Елисеев

Потому что на composer install выдавало ошибку

Нужно добавить права на запись всем для самой папки api.

Ответить
Максим

В этом проекте у нас нет такой папки, она в проекте аукциона. Хотя впрочем, здесь это сработало по аналогии. Спасибо!

Ответить
slo_nik

Добрый день, Дмитрий.

Подскажите, пожалуйста, почему при создании cli interpreter у меня в path mappings добавляется ещё один путь?

/home/slonik/.config/JetBrains/PhpStorm2022.3/scratches->/opt/stratches

Посностью path mappings выглядит так:

<Project root>->/app;/home/slonik/.config/JetBrains/PhpStorm2022.3/scratches->/opt/stratches

Пытаюсь удалить его в Edit Progect Path Mappings, но он не активен.

Откуда подставляется этот путь и как его удалить, если он не нужен?

Версия PhpStorm 2022.3

Ответить
Дмитрий Елисеев

Недавно в JetBrains добавили Scratch files. Это они теперь монтируются.

Ответить
slo_nik

А можно ли это как-то отключить?

Под это создаётся image, container и volume. Какой толк от этого?

Ответить
Дмитрий Елисеев

Может можно. Не интересовался.

Ответить
Кирилл

Дмитрий, подскажите пожалуйста, у меня нарисовалась проблема с правами у php-cli, не удается создать файл composer.json и не получается соответственно скачать все зависимости, создать папку vendor и composer.lock

file_put_contents(./composer.json): Failed to open stream: Permission denied 

Хотя все Dockerfile использую такой же, который вы показываете в данном уроке, плюс свежая установка Ubuntu, никакие права юзера не менял.

Ответить
Кирилл

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

Ну и плюс рекомендую тем, у кого лезут ошибки при установке, почитать комменты выше) Возможно там есть ответ на вопрос)

Ответить
Dmitry

Ошибка на строке

RUN addgroup -g 1000 app && adduser -u 1000 -G app /bin/sh -D app
/bin/sh: groupadd: not found
The command '/bin/sh -c groupadd -g 1000...' returned a non-zero code: 127

и не только на groupadd ругается, но и, например, на apt-get тоже.

Как исправить?

Ответить
Дмитрий Елисеев

Проблема из-за разных дистрибутивов Linux.

Команды groupadd и apt-get используются в Debian и Ubuntu, а мы используем addgroup и apk для Alpine.

Ответить
Максим

Дмитрий, добрый день! Расскажите пожалуйста подробнее, какой профит мы получаем от контейнера php-cli? Или тут сугубо философия? Просто не понимаю, зачем добавлять отдельный контейнер, если мы можем обойтись без него, ведь php-cli у нас уже есть в контейнере php-fpm.

Ответить
Дмитрий Елисеев

При таком разделении мы можем :

  • в php-cli ставить Composer и wait-for-it.sh, которые не нужны в php-fpm
  • в php-fpm прописать HEALTHCHECK, который не нужен в php-cli
Ответить
Константин

Добрый день!

Не получается установить psalm. На команде

docker compose run --rm php-cli ./vendor/bin/psalm --init

говорит

PHP Fatal error:  Uncaught Psalm\Exception\ConfigException: Config not found for path /app/vendor/bin/psalm in /app/vendor/vimeo/psalm/src/Psalm/Checker/ProjectChecker.php:767
Stack trace:
#0 /app/vendor/vimeo/psalm/src/Psalm/Checker/ProjectChecker.php(448): Psalm\Checker\ProjectChecker->getConfigForPath('/app/vendor/bin...')
#1 /app/vendor/vimeo/psalm/bin/psalm(172): Psalm\Checker\ProjectChecker->checkFile('/app/vendor/bin...')
#2 /app/vendor/bin/psalm(119): include('/app/vendor/vim...')
#3 {main}
  thrown in /app/vendor/vimeo/psalm/src/Psalm/Checker/ProjectChecker.php on line 767

Fatal error: Uncaught Psalm\Exception\ConfigException: Config not found for path /app/vendor/bin/psalm in /app/vendor/vimeo/psalm/src/Psalm/Checker/ProjectChecker.php:767
Stack trace:
#0 /app/vendor/vimeo/psalm/src/Psalm/Checker/ProjectChecker.php(448): Psalm\Checker\ProjectChecker->getConfigForPath('/app/vendor/bin...')
#1 /app/vendor/vimeo/psalm/bin/psalm(172): Psalm\Checker\ProjectChecker->checkFile('/app/vendor/bin...')
#2 /app/vendor/bin/psalm(119): include('/app/vendor/vim...')
#3 {main}
  thrown in /app/vendor/vimeo/psalm/src/Psalm/Checker/ProjectChecker.php on line 767
Ответить
Иван

Дмитрий, добрый день!

С учетом того, что PhpStorm ушел из России, могли бы вы записать скринкаст с аналогичными настройками для VSCode?

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Yandex
MailRu
GitHub
Google