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
эхо "\ п ";эхо "\ п ";
эхо "
эхо "\ п ";
эхо "\ п ";
эхо "
Если вы просмотрите исходный код страницы \ 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 пакетами Феликса Беккера.
Счастливое кодирование!