Как настроить среду разработки Laravel для Windows без Docker

Источник: «How to setup a real fast local Laravel development environment for Windows with pretty URLs (without Docker)»
Локальные среды Laravel под Windows, такие, как Vagrant/Homestead, Laravel Sail или Laragon, могут быть очень медленными или ресурсоёмкими. Давайте создадим более нативную установку, которая работает очень хорошо! Нам удалось сократить время выполнения сложных операций с 13 с. до 1,5 с., что составляет прирост около 800%!

Медленные установки

Мы в Laracraft перепробовали множество локальных сред разработки Laravel под Windows, но нас не устроила производительность и удобство использования таких известных сред, как: php artisan serve, Homestead/Vagrant, Laravel Sail, Laragon и т.д… Эти инструменты, безусловно, очень хороши, если вы, возможно, создаёте новый Laravel-проект, в котором нет очень сложных операций и запросов, и вы работаете только с небольшой базой данных. Но если вам нужна большая производительность для тяжёлых запросов, то этих инструментов будет недостаточно:

php artisan serve

Homestead/Vagrant

Laravel Sail

Laragon

Создадим быструю установку

Поэтому мы решили использовать Laravel с WSL и собственной установкой и настройкой php, mysql и nginx. Несмотря на то, что установка может показаться пугающей, мы действительно впечатлены очень быстрой производительностью и гибкостью конфигурации. С помощью этого руководства настройка должна быть лёгкой, так что это определённо стоит того!

Требования

Убедитесь, что ваша версия Windows поддерживает WSL: Windows 10, версия 2004 или выше (Build 19041 или выше), или Windows 11

Установка WSL

Откройте PowerShell с правами администратора и запустите команду:

wsl.exe --install

Дождитесь окончания установки, это может занять некоторое время. После этого перезагрузите компьютер, и при входе в учётную запись windows автоматически откроется командная строка, которая завершит установку WSL. После этого вам будет предложено ввести учётные данные пользователя для WSL.

Установка PHP

Теперь откройте терминал WSL и поочерёдно выполните следующие команды:

sudo apt-get update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt install openssl unzip php8.2-cli php8.2-bcmath php8.2-curl php8.2-json php8.2-mbstring php8.2-mysql php8.2-tokenizer php8.2-xml php8.2-zip php8.2-fpm

Установка Composer

Для установки composer выполните последовательно следующие команды:

cd ~
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
HASH=`curl -sS https://composer.github.io/installer.sig`
php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

Установка MySQL

Теперь установим MySQL:

sudo apt-get install mysql-server

После завершения установки меняем пароль root для MySQL на password, или на то, что вам больше нравится. В связи с этим необходимо запустить mysql от имени root:

sudo mysql

С помощью этой SQL команды можно изменить пароль:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Теперь выйдите из mysql с помощью команды exit; и проверьте подключение к mysql от имени root с заданным паролем:

mysql -u root -p

Если все получилось, переходите к следующему шагу!

Установка Laravel

Возможно, у вас уже есть проект, но в рамках данной статьи мы установим новое приложение Laravel:

cd~
mkdir code
cd code
composer create-project laravel/laravel example-app

Нам нужна база данных, давайте создадим её:

mysql -uroot -p -e "create database example_app"

Настройте .env файл и установите:

DB_DATABASE=example_app
DB_USERNAME=root
DB_PASSWORD=password

Теперь перейдём к миграции базы данных:

cd example-app
php artisan migrate

Установка и настройка NGINX

Последнее, что нам сейчас нужно, — это веб-сервер, давайте установим NGINX:

sudo apt-get install nginx

Поскольку мы хотим использовать красивый url, не забудьте добавить example-app.test в файл hosts, чтобы при вводе его в браузер он разрешался в наш локальный nginx. Для этого откройте редактор от имени администратора и откройте: C:\Windows\System32\drivers\etc\hosts (убедитесь, что в диалоге открытия файла указан список "Все файлы", иначе файл hosts не будет показан).

Теперь добавьте в конец файла следующую новую строку:

127.0.0.1 example-app.test

Теперь давайте настроим nginx! Создайте следующий файл:

sudo nano /etc/nginx/sites-available/example-app

И вставьте стандартную конфигурацию Laravel Nginx:

server {
listen 80;
listen [::]:80;
server_name example-app.test;
root /home/zacha/code/example-app/public;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";

index index.php;

charset utf-8;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

error_page 404 /index.php;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\.(?!well-known).* {
deny all;
}
}

Настройте директивы server_name, root и, возможно, fastcgi_pass сокет (если вы установили другую версию php) в соответствии с вашими потребностями!

Теперь включите этот сайт:

sudo ln -s /etc/nginx/sites-available/example-app /etc/nginx/sites-enabled/example-app

Проверьте правильность синтаксиса конфигурации nginx и перезагрузите его:

sudo nginx -t
sudo nginx -s reload

По нашему опыту, лучше всего сменить пользователя nginx и php-fpm на текущего пользователя, тогда проблем с правами на файлы не возникнет. Дело в том, что если просто изменить права на текущую папку на группу www-data, то проблемы все равно возникнут, если, например, при git pull будут созданы новые файлы.

Поэтому давайте изменим nginx на вашего текущего пользователя в самой верхней части файла:

sudo nano /etc/nginx/nginx.conf
user       nginx;
worker_processes auto;
error_log logs/error.log;
pid logs/nginx.pid;

events {
worker_connections 4096; ## Default: 1024
}

http {
include conf/mime.types;
include /etc/nginx/proxy.conf;
include /etc/nginx/fastcgi.conf;
index index.html index.htm index.php;

default_type application/octet-stream;

Также измените пользователя и группу fpm на вашего текущего пользователя:

sudo nano /etc/php/8.2/fpm/pool.d/www.conf
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Теперь перезапустите fpm и nginx:

sudo service php8.2-fpm restart
sudo service nginx restart

Готово

Вот и все, теперь откройте http://example-app.test в своём браузере и наслаждайтесь очень быстрым временем отклика!

Нам удалось сократить время выполнения сложных операций с 13 с. до 1,5 с., что означает прирост около 800%!

Дополнительные материалы

Предыдущая Статья

Зачем использовать declare(strict_types=1) в PHP

Следующая Статья

PHP итераторы для перебора структур данных