Ubuntu

Ubuntu 20.04, WSL2, VSCode и Drupal 8 - устранение ошибок

Ubuntu 20.04, WSL2, VSCode и Drupal 8 - устранение ошибок

Microsoft наконец-то представила фантастическое решение для разработки приложений Linux на Windows.  Подсистема Windows для Linux, WSL2, довольно легко установить, настроить и запустить, особенно если вы уже знакомы с Linux.  Даже если это не так, есть много очень хороших статей о том, как начать базовую установку.

Разработка PHP-приложений для Linux с использованием VSCode в Windows 10 настолько стабильна и удобна, насколько это возможно. Тем не менее, некоторые «подводные камни», с которыми я столкнулся, не были описаны ни в одной из найденных мной статей о настройке LAMP на Ubuntu и WSL2.

У меня был ограниченный опыт работы с Linux, и я сильно зависел от статей, написанных теми, кто был до меня.  Хотя они помогли мне в этом, я столкнулся с несколькими проблемами при запуске Drupal 8 без ошибок и отладки, работающей в VSCode.  Решения были найдены в разделах комментариев вопросов, размещенных в Интернете. Это заняло много часов поиска, и я надеюсь спасти людей, представив решения, которые я нашел в этой статье.

Моя среда - Windows 10 20H2, Ubuntu 20.04, PHP 7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode with Remote - WSL и PHP Debug пакетами Феликса Беккера.  Я запускаю WSL из Powershell в Windows Terminal.

Прежде чем мы начнем, вот несколько рекомендаций, которые могут сэкономить ваше время.

Установка и использование apt-fast вместо apt действительно может ускорить установку и обновление.  Там, где я живу, Интернет медленный и с низкой пропускной способностью, а apt-fast намного быстрее, чем apt.

Вы можете «сделать резервную копию и восстановить» свой дистрибутив Linux с помощью экспорта и импорта WSL. Как и в любой системе, рекомендуется всегда поддерживать текущую резервную копию.

Mariadb устанавливается нормально, но не может перезапустить или получить статус

Установка Mariadb прошла нормально.  Никаких ошибок и предупреждений.  Когда я попытался проверить статус, у меня возникла ошибка в системе.

$> systemctl статус mysql
Система не была загружена с использованием systemd в качестве системы инициализации (PID 1). Не могу работать.

Причина этой ошибки в том, что Microsoft не поддерживает systemd в WSL.  К счастью, компания Arkane Systems создала пакет system-genie, чтобы включить systemd .  Я предлагаю внимательно прочитать их веб-страницу, прежде чем пытаться выполнять следующие инструкции, которые были взяты с этой страницы. Для дистрибутивов, отличных от Ubuntu, есть немного другие инструкции.

Во-первых, вам нужно установить .Сеть 5.0 время выполнения

$> sudo apt-быстрое обновление
$> sudo sudo apt-fast install -y apt-transport-https
$> sudo apt-быстрое обновление
$> sudo apt-fast install -y dotnet-sdk-5.0

Далее нам нужно настроить репозиторий wsl-transdebian

$> sudo apt-fast install apt-transport-https
$> wget -O / etc / apt / доверенный.gpg.d / wsl-transdebian.gpg https: // arkane-systems.github.io / wsl-transdebian / apt / wsl-transdebian.gpg
$> chmod a + r / etc / apt / доверенный.gpg.d / wsl-transdebian.gpg
$> кошка << EOF > / и т.д. / APT / источники.список.d / wsl-transdebian.список
$> deb https: // arkane-системы.github.io / wsl-transdebian / apt / bullseye основной
$> deb-src https: // arkane-системы.github.io / wsl-transdebian / apt / bullseye основной
$> быстрое обновление

Теперь мы можем установить пакет system-genie.

sudo apt-fast install -y systemd-genie

Закройте оболочку Linux, затем выключите WSL из оболочки Power

PS C: \ Users \ UsrName> wsl --shutdown

Перезапустите WSL с помощью джинна из командной строки Powershell.

PS C: \ Users \ UsrName> wsl genie --s

Вы увидите «Ожидание systemd… .!!!!!!!!!!!!!!!”.  Полная загрузка занимает 180 секунд.  Просто подожди, пока он закончится.  Когда это будет сделано, ваше новое окно оболочки должно выглядеть так:

Ожидание systemd… !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Истекло время ожидания перехода systemd в рабочее состояние.
Это может указывать на ошибку конфигурации systemd.
Попытка продолжить.

Убедитесь, что genie установлен и systemd работает:

systemctl статус mariadb

Вы должны получить вывод статуса для mariadb.  Обратите внимание, что mysql состояния systemctl также работает.

Arkane Systems рекомендует завершить сеанс WSL genie с помощью wsl -shutdown.  Это освободит всю память, используемую WSL в Windows.

Drupal устанавливается, но CSS не загружается

После выполнения базовой установки Drupal 8 страницы не форматировались.  Просмотр источника страницы показал, что файлы CSS не загружаются. Мне потребовалось два дня, чтобы понять это, но вкратце: Drupal предполагает, что apache2 использует каталог / tmp, но это не так.  По умолчанию apache2 настроен на использование частной директории tmp.  Как ни странно, вызов sys_get_temp_dir () из php return / tmp, но это не то, что использует apache2.  Когда Drupal создает свои оптимизированные файлы css и js, он сначала пытается записать их в папку / tmp, а затем перемещает их в папку назначения, обычно sites / default / files / css и / js. Но apache2 не использует / tmp, поэтому этот процесс не выполняется, и ни один из файлов css или js. Снятие отметки с агрегированных файлов CSS и Javascript позволит обойти это, но затем будут загружены все отдельные файлы css и js, так что это не решение.

Вы можете подтвердить, что эта проблема / tmp недоступна, с помощью следующего простого файла php. Он создает tmpfile и отображает имя файла.  Первоначально имя файла будет пустым, потому что вызов tmpfile () возвращает NULL.  Я тестирую следующий код.php и назвал его с моего сайта localhost / mysite / test.php

эхо "\ п ";
эхо "\ п ";
эхо "Мой второй пример PHP\ п ";
эхо "\ п ";
эхо "\ п ";
эхо "

Если вы просмотрите исходный код страницы \ r \ n, вы найдете в этой строке новую строку.";
 
эхо "

тестирование

";
$ tmpDir = sys_get_temp_dir ();
эхо "

Директория TMP = '$ tmpDir'

";
$ файл = tmpfile ();
$ path = stream_get_meta_data ($ файл) ['uri'];
эхо "

Путь к tmp-файлу = '$ path'

";
 
эхо "\ п ";
эхо "\ п ";
?>
 
Это привело к появлению «Путь к файлу tmp =»

Я нашел решение этого в комментариях к вопросу о Stackoverflow от пользователя One In a Million Apps.  Это решение изменяет конфигурацию apache2 с PrivateTmp = true на PrivateTmp = false. Обратите внимание, что изменение apache2 для использования частного каталога tmp было сделано по соображениям безопасности, и большинство приложений можно настроить для использования другой папки tmp.  Я пробовал это с Drupal, но не смог заставить его работать. Это моя первая попытка запустить Drupal в Linux, и я хотел, чтобы все «просто работало» на моем ноутбуке, не заботясь о безопасности.

Сначала найдите файл, содержащий PrivateTmp, используя его из каталога / lib:

%> sudo find / -mount -type f -exec grep -e "PrivateTmp" '' ';' -Распечатать

Это дало мне длинный список совпадений.  Найдите тот, который содержит файл apache2.услуга.  В моем случае он был найден в / usr / lib / systemd / system / apache2.услуга.  скопируйте этот файл в / etc. каталог. Отредактируйте / etc / apache2.services и измените PrivateTmp = true на PrivateTmp = false, сохраните и перезапустите службу apache2.

systemctl перезапустить apache2

Повторно запустить тест.php снова, и вы должны отобразить tmp-файл с именем, подтверждающий доступ к папке / tmp.

Очистите все кеши Drupal и перезагрузите страницы.  Теперь они должны отображаться правильно. Не знаю почему, но функция Drupal Clear Cache у меня не всегда работает.  Ручное удаление всех файлов в sites / default / files / css js, а затем использование PhpMyAdmin для очистки таблиц кеша всегда работает.

Настройка отладки VSCode

Настроить Xdebug

Сначала установите пакеты Remote - WSL и PHP Debug by Felix Becker в VSCode.

Затем я установил Xdebug

sudo apt-fast php7.3-xdebug

Это установленная версия 3.02 из Xdebug.

Я попытался настроить его, следуя многочисленным примерам в Интернете.  Ничего не сработало.  Оказывается, большинство примеров относятся к Xdebug 2.x, и эти параметры конфигурации больше не работают с 3.Икс

Наконец-то я получил его работу со следующим php.ini настройки.

Мне пришлось добавить следующее в оба / etc / php / 7.3 / apache2 / php.ini и / etc / php / 7.3 / cli / php.ini в моей системе.

Вы можете найти расположение вашего xdebug.поэтому, перейдя в файл каталога / lib, затем запустив

find -name xdebug.так что [xdebug]
zend_extension = ./ lib / php / 20180731 / xdebug.так
xdebug.start_with_request = триггер
xdebug.режим = отладка
xdebug.Discover_client_host = 1
xdebug.журнал = / tmp / xdebug_remote.бревно
xdebug.client_port = 9003

Настроить VSCode

Удаленная отладка в VSCode использует запуск.json, хранящийся в корне каталога вашего проекта в .vscode / запуск.json.

Вы можете создать запуск.json через пользовательский интерфейс VSCode, но мне проще создать его вручную.  Перейдите в корень вашего сайта и создайте .каталог vscode. Создать запуск.json и загрузите его в VSCode.

$> mkdir .vscode
$> cd .vscode
$> сенсорный запуск.json
$> запуск кода.json

Поместите в файл следующий json и сохраните его.


// Используйте IntelliSense, чтобы узнать о возможных атрибутах.
// Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов.
// Для получения дополнительной информации посетите: https: // go.Майкрософт.com / fwlink /?linkid = 830387
"версия": "0.2.0 ",
"конфигурации": [

"name": "Слушайте XDebug",
"тип": "php",
"запрос": "запуск",
«порт»: 9003,
"stopOnEntry": правда,
"журнал": правда,
"pathMappings":

"/ var / www / html": "$ workspaceRoot"

,

"name": "Запустить открытый в данный момент скрипт",
"тип": "php",
"запрос": "запуск",
"программа": "$ файл",
"cwd": "$ fileDirname",
«порт»: 9003

]

Обратите внимание, что в разделе pathMappings, где у меня есть «/ var / www / html», вы должны указать полный путь к корню вашего веб-сайта.

Закройте VSCode. В командной строке WSL Linux вернитесь в корень вашего веб-сайта и загрузите проект в VSCode.  Предполагая, что вы все еще в .каталог vscode,

$> cd…
$> код .

Это должно загрузить проект в VSCode, и вы должны увидеть полное дерево каталогов вашего проекта слева.  Откройте свою стартовую страницу, например index.php и добавьте точку останова.  Нажмите F5, чтобы начать отладку.  Зайдите в веб-браузер и загрузите сайт. Вернитесь к VSCode, и вы должны увидеть, что он остановился на вашей точке останова.

Код не запускается с оболочкой zsh

По умолчанию WSL настроен для работы с оболочкой Bash и видит путь к исполняемому файлу VSCode в PATH.  Я перешел на zsh, и VSCode больше не запускался.  Исправление заключалось в том, чтобы добавить псевдоним в .zshrc

$> cd ~
$> код .zshrc

Добавьте следующий псевдоним, который указывает на полный путь к папке с исполняемым кодом, как ее видит Ubuntu в WSL.  Замените YourUserName своим фактическим именем пользователя Windows.

псевдоним code = "/ mnt / c / Users / YourUserName / AppData / Local / Programs / Microsoft \ VS \ Code / bin / code"

Теперь вам нужно перезагрузить конфигурацию zsh с помощью

$> источник .zshrc

Теперь код должен загружаться из оболочки zsh.

это оно!!  Эти шаги, наконец, заставили меня правильно работать отладку Drupal и VSCode.  Мне потребовалось два дня, чтобы во всем разобраться. Я новичок! Надеюсь, это сработает для вас и сэкономит ваше время.

Просто напоминание о моем окружении.  Windows 10 20H2, Ubuntu 20.04, PHP 7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode with Remote - WSL и PHP Debug пакетами Феликса Беккера.

Счастливое кодирование!

Как показать счетчик FPS в играх для Linux
Игры для Linux получили серьезный толчок, когда Valve объявила о поддержке Linux для клиента Steam и своих игр в 2012 году. С тех пор многие игры AAA ...
Как загрузить и играть в Sid Meier's Civilization VI в Linux
Введение в игру Civilization 6 - это современный подход к классической концепции, представленной в серии игр Age of Empires. Идея была довольно просто...
Как установить Doom и играть в него в Linux
Введение в Doom Серия Doom возникла в 90-х годах после выхода оригинальной Doom. Это мгновенно стал хитом, и с тех пор серия игр получила множество на...