windows

Criando um ambiente de desenvolvimento PHP com WSL

O WSL é uma alternativa interessante para quem precisa configurar um ambiente de desenvolvimento em Linux dentro do Windows. Com ele você pode escolher a sua distribuição Linux preferida e configurar seu ambiente exatamente da mesma forma que você configuraria em uma máquina Linux ou em um servidor, por exemplo.

Nesse artigo vamos criar um ambiente de desenvolvimento PHP completo, com MySQL e Nginx dentro do WSL.

Instalação do WSL

Antes de mais nada, é preciso habilitar o WSL na sua máquina e instalar a distribuição de sua escolha. Se você ainda não conhece o WSL ou tem dúvidas se sua máquina tem suporte a ele, recomendo a leitura do artigo O que é Windows Subsystem for Linux (WSL)? para saber mais e acompanhar o processo de instalação.

Para esse tutorial vou utilizar o Ubuntu 18.04. Os comandos apresentados aqui podem não funcionar com outras distribuições, mas você pode utilizar esse artigo para ter uma ideia geral.

Instalando o Nginx

Para iniciar vamos iniciar nosso terminal com o WSL e instalar o Nginx. Ele está disponível via apt-get e pode ser instalado com os comandos abaixo como sudo:

sudo apt-get update
sudo apt-get install nginx

Aproveite esse momento e instale utilitários como o git para versionamento de código e um editor de textos de sua preferência, como o vim:

sudo apt-get install git vim

Depois é necessário habilitar o serviço do Nginx dentro do WSL, antes disso verifique se a porta 80 da sua máquina está liberada. Você pode executar o seguinte comando PowerShell como administrador para descobrir isso:

Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess

Se o comando retornar erro, a porta 80 está liberada para uso:

Verificando a porta 80 com PowerShell

Feito isso, volte para seu terminal do WSL e execute o comando:

sudo service nginx start

Com isso seu localhost já estará funcionando:

Página inicial do nginx

Como o WSL não suporta o gerenciamento de serviços usando systemd, sempre que você reiniciar a máquina e iniciar uma nova sessão com o WSL, você precisa iniciar o serviço do Nginx novamente. Veremos como resolver isso logo mais.

Instalando o MySQL

O MySQL 5.7 pode ser instalado a partir do apt-get no Ubuntu 18.04:

sudo apt-get install mysql-server

Como também aconteceu com o Nginx, é preciso iniciar o serviço do MySQL manualmente:

sudo service mysql start

Para acessar sua instância do MySQL, é preciso criar um novo usuário no seu banco de dados para ser utilizado junto com sua aplicação. No seu terminal inicie o cliente do MySQL executando sudo mysql e execute a seguinte query:

GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Isso irá criar um usuário chamado admin com a senha password. Esse usuário será acessível apenas pelo endereço localhost. Troque o usuário e senha para algo mais seguro e digite exit para sair do cliente do MySQL.

Teste a conexão com o MySQL utilizando algum cliente, você pode utilizar o MySQL Workbench por exemplo:

Teste da conexão com o MySQL

Instalando o PHP

Agora vamos de fato instalar o PHP e configurá-lo para funcionar com o Nginx. É preciso instalar o PHP-FPM (FastCGI Process Manager) para que o Nginx consiga delegar as requisições recebidas para as páginas a serem interpretadas com PHP. Como estamos utilizando o MySQL como banco de dados, é interessante instalar a extensão do MySQL também:

sudo apt-get install php-fpm php-mysql

Com isso será instalado a versão 7.2 do PHP juntamente com o FPM e as extensões do MySQL:

Versão do php

Depois de instalado, inicie o serviço do PHP-FPM:

sudo service php7.2-fpm start

Configurando nosso site

Por fim, vamos configurar nosso site para ser executado com PHP. Crie um arquivo em /etc/nginx/sites-available/localhost com o seguinte conteúdo:

server {
  listen 80;
  root /var/www/html;
  index index.php index.html index.htm index.nginx-debian.html;
  server_name localhost;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
  }

  location ~ /\.ht {
    deny all;
  }
}

Habilite o site criado para utilizar a nova configuração através de um link simbólico (conhecido também como symlink) no diretório /etc/nginx/sites-enabled e remova a configuração de site padrão com os seguintes comandos:

sudo ln -s /etc/nginx/sites-available/localhost /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default

Reinicie o serviço do Nginx para ler essas novas configurações:

sudo service nginx restart

E crie o arquivo /var/www/html/index.php com o seguinte conteúdo:

<?php 
phpinfo();

No meu caso, eu precisei alterar o dono do diretório /var/www/html para poder criar esse arquivo:

sudo chown -R $USER: /var/www/html

Com isso, você deve conseguir ver a configuração do PHP no seu navegador:

Configurações do php

Configurando os serviços para iniciarem automaticamente

Devido a algumas limitações na arquitetura do WSL, não é possível iniciar serviços automaticamente pelo systemd. Para contornar isso podemos iniciar esses serviços a partir do nosso arquivo .bashrc e desabilitar a necessidade de perguntar a senha do sudo para esses serviços.

Lembrando que essa prática não é recomendada em ambientes de produção. Em produção utilize o systemd e nunca permita que serviços que precisam de permissões elevadas rodem sem precisar inserir uma senha.

Adicione as seguintes linhas no seu arquivo /etc/sudoers:

%sudo ALL=NOPASSWD: /etc/init.d/mysql
%sudo ALL=NOPASSWD: /etc/init.d/nginx
%sudo ALL=NOPASSWD: /etc/init.d/php7.2-fpm

E no seu arquivo do ~/.bashrc inclua o seguinte:

sudo /etc/init.d/nginx start
sudo /etc/init.d/mysql start
sudo /etc/init.d/php7.2-fpm start

Com isso, sempre que iniciar seu terminal do WSL os serviços serão iniciados automaticamente. Caso esteja utilizando alguma linguagem diferente, a ideia é a mesma: inclua os serviços necessário no .bashrc e desabilite a senha para esses serviços no /etc/sudoers.

Configurando sua IDE

Após tudo configurado, chegou a hora de configurarmos nossa IDE para utilizar o WSL. Da forma que configuramos nosso ambiente, os scripts PHP estão dentro da estrutura de arquivos do WSL.

Como o WSL não suporta ferramentas com interface gráfica, não podemos instalar nossa IDE.

Podemos resolver isso de algumas formas. Uma delas é salvar nossos arquivos nos diretórios do Windows e dentro do WSL configurar o Nginx para apontar para um diretório dentro de /mnt/c/. Esse diretório é mapeado diretamente com o C: do seu sistema e permite o WSL ter acesso a esses arquivos.

Caso você utilize o VS Code, uma melhor alternativa é utilizar os arquivos salvos diretamente dentro da estrutura do WSL. Existe uma extensão ainda em preview chamada Remote Development. Com ela é possível se conectar com sistemas externos através de SSH, Container ou WSL para trabalhar diretamente com o sistema de arquivos dessas soluções.

Para utilizar o Remote Development com o WSL, instale a extensão Remote – WSL no seu VS code e reinicie o mesmo.

Extensão Remote - WSL

Ao reiniciar, repare no canto esquerdo um novo ícone verde. A partir dele é possível abrir uma nova janela do VS Code com acesso ao sistema de arquivos da sua distribuição no WSL:

Nova janela com acesso ao WSL

Ao abrir essa nova janela, será instalado um agente dentro do WSL que permite a conexão com o VS Code. O ícone verde indicará o nome da sua distribuição que o VS Code está conectado. Ao abrir um diretório você navegará no sistema de arquivos do WSL.

Abra o diretório /var/www/html e podemos observar que nosso index.php está acessível:

Abrir diretório

Arquivos no WSL

Esse agente que é instalado no WSL permite uma melhor integração com o VS Code. Com ele é possível dentro do terminal do WSL abrir qualquer diretório que você esteja navegando utilizando o comando code . e também é possível instalar extensões do VS Code para executarem diretamente dentro do WSL, como por exemplo as extensões de intellisense e debug para PHP:

Extensões instalados no WSL

Para a extensão intellisense do PHP funcionar, é preciso que o executável do PHP esteja disponível no sistema. Instalando essa extensão dentro do WSL você consegue utilizar do executável já disponível no WSL, concentrando todas as funcionalidades necessárias para o seu ambiente em um único lugar.

Conclusão

Aprendemos nesse artigo como criar do zero um ambiente de desenvolvimento para PHP dentro do WSL. Esse ambiente pode ser uma alternativa para quem precisa executar um projeto em ambiente Linux dentro do Windows. Vimos também como configurar o VS Code para acessar diretamente os arquivos dentro do sistema de arquivos do WSL, tornando uma experiência muito próxima com a que teríamos com o Linux.

O que é Windows Subsystem for Linux (WSL)?

Durante nosso dia a dia como desenvolvedores usamos diversas ferramentas pela linha de comando. Podemos utilizar git para versionar nossos projetos, instalar dependências com npm ou executar scripts para automatizar tarefas. Algumas dessas ferramentas são compatíveis com diversos sistemas operacionais, porém algumas delas são criadas levando em consideração somente o sistema Linux, não levando em conta as particularidades para serem executadas no Windows.

Como não é viável tornar todas as ferramentas compatíveis tanto com Windows como Linux, por que não tornar o Windows compatível com essas ferramentas? O Windows Subsystem for Linux (WSL) vem para resolver esse problema.

Como o WSL funciona?

O WSL é um recurso opcional disponível no Windows 10 (a partir da versão 1607) que te permite executar binários e scripts em Linux diretamente no Windows, traduzindo as instruções enviadas para o sistema (as chamadas de sistema ou system calls) para uma instrução válida para o kernel do Windows. Com ele é possível ter um ambiente idêntico a de uma distribuição Linux que você já esteja acostumado sem precisar usar uma máquina virtual ou algo do tipo para isso.

O WSL permite que você instale múltiplas distribuições Linux na sua máquina, cada qual com uma estrutura de arquivos isolada e independente do sistema e de outras distribuições, similar com o que ocorre com uma máquina virtual.

Instalação

É possível habilitar o WSL executando o comando abaixo a partir de uma janela do PowerShell com permissão de Administrador:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Após reiniciar sua máquina você pode instalar uma versão da sua distribuição preferida a partir da Microsoft Store. Digite Linux na barra de busca e você encontrará várias distribuições como Ubuntu, Debian, Suse e até o Kali Linux.

Distribuições disponíveis na Microsoft Store

Após instalar e executar o aplicativo da distribuição desejada, é solicitado que você crie um usuário e senha para usar como o sudo da sua distribuição. Como exemplo, escolhi o Ubuntu 18.04 como a distribuição na minha máquina e criei um usuário chamado treinaweb:

Configuração do Ubuntu 18.04

Você pode encontrar no menu iniciar a distribuição instalada para usá-la posteriormente, digitando na barra de busca o nome da distribuição. Você pode fixar esse atalho na barra de tarefas, no iniciar ou na área de trabalho se desejar.

Ubuntu 18.04 no menu iniciar

Funcionalidades

Ao contrário de uma máquina virtual, o WSL é integrado com o sistema, permitindo o acesso dos arquivos tanto do sistema como os arquivos da distribuição. Dentro da distribuição os discos da sua máquina estão mapeados dentro do diretório /mnt/ e no Windows os arquivos da distribuição estão no caminho de rede \\\\wsl$

Arquivos do Windows dentro do WSL

Arquivos da distribuição como caminho de rede

Com o utilitário wslpath é possível converter os caminhos de diretório entre o WSL e Windows e vice-versa.

Exemplo wslpath

É possível também utilizar executáveis do Linux dentro do PowerShell ou Prompt de comando diretamente com wsl e até mesmo rodar executáveis do Windows dentro do WSL.

Executáveis do Windows junto com binários Linux

Outro uso comum é utilizar o WSL como ambiente de desenvolvimento web. Tanto o sistema como o WSL compartilham o mesmo IP de rede, logo para acessar o servidor web do seu ambiente basta utilizar localhost e informar a porta que você deseja acessar.

Servidor interno do PHP rodando no WSL

Vale lembrar que o WSL não substitui completamente uma máquina virtual. O público alvo do WSL são desenvolvedores que precisam executar ferramentas em linha de comando. Aplicações que usam a interface gráfica não são compatíveis com o WSL.

Aplicativos que invocam funções nativas do kernel do Linux também não são compatíveis com o WSL, como por exemplo, o Docker. Nesses casos uma máquina virtual ou o Docker for Desktop podem ser melhores soluções.

O que vem por aí

O WSL se mostrou até agora uma alternativa interessante para quem precisa executar ferramentas e aplicações Linux dentro do Windows de forma leve e integrada. Entretanto, na sua versão atual o WSL não tem compatibilidade total com as funções do kernel do Linux e com aplicações que fazem uso intenso de disco existe um gargalo no desempenho de leitura de disco se comparado com outras soluções.

Tendo isso em vista a Microsoft anunciou o WSL 2, uma nova versão que promete compatibilidade total com o kernel do Linux e performance de disco mais rápida. Para que isso seja possível o WSL 2 contará com o próprio kernel do Linux distribuído dentro do Windows ao invés de uma camada de tradução de system calls! O código do kernel utilizado é baseado na versão 4.19 e pode ser encontrado aqui.

O WSL 2 ainda está em desenvolvimento, disponível somente a partir do build 18917 do Windows Insider.

Alternativas para substituir o prompt de comando do Windows

Programadores que desenvolvem utilizando o Windows e necessitam fazer o uso do prompt de comando (cmd), entendem que é uma ferramenta extremamente limitada, por isso diversas alternativas estão disponíveis.

Neste artigo veremos as principais e o que elas podem prover.

ConEmu

O ConEmu é um emulador de terminal Open Source para o Windows. É extremamente útil por permitir a subdivisão de janelas com vários terminais, abertura de múltiplas abas, customização de cores e fontes, etc.

No link https://conemu.github.io/ encontra-se toda documentação, passo a passo da instalação e o download gratuito da ferramenta.

cmder

Considerada uma das melhores ferramentas para substituir o cmd por possibilitar a utilização de comandos UNIX (rm, ls, mv, cd e etc.) mais utilizados pelos desenvolvedores. O cmder possui poderosos recursos de edição de linha de comando, histórico dos comandos já utilizados anteriormente e auto-complete, permitindo maior agilidade no uso do terminal.

No link http://cmder.net/ é possível baixar a ferramenta e acessar sua documentação.

Git Bash

É basicamente um terminal Linux para seu Windows. É o terminal padrão do Git e possui integração nativa com a ferramenta, além disso, permite ao usuário a customização de cores, auto-complete e cópia de texto. Possui auto-complete de todos os comandos utilizados para o controle de versão com o git.

O download da ferramenta pode ser feita a partir do link https://gitforwindows.org/

console2

É o aprimoramento do prompt de comando do Windows. De fácil utilização e que apresenta diversas funcionalidades, como: Seleção de texto semelhante a um editor de texto, diferentes tipos de plano de fundo, fonte configurável, diferentes estilos de janelas, etc.

Altamente personalizável, o console2 possui recursos como Ctrl + c e Ctrl + v (o famoso selecionar para copiar), atalhos para abertura de novas guias e alternar abas, fazendo com que a experiência em seu uso seja simples e desejável.

O download pode ser feito acessando o link https://sourceforge.net/projects/console/

PowerCmd

Com uma interface de fácil utilização, o PowerCmd simplifica o uso do prompt de comando. Suas funcionalidades são similares ao ConEmu. Permite salvar e restaurar as últimas sessões, realizar a personalização da barra de ferramentas para aplicativos de inicialização rápida, possibilita a utilização de múltiplas abas e a subdivisão da mesma janela com vários terminais, dentre outras funcionalidades.

Para fazer o uso da ferramenta, é possível fazer seu download a partir do link http://www.powercmd.com/

Concluindo:

As ferramentas listadas são ótimas opções para substituição do prompt de comando do Windows, para que recursos simples sejam adicionados ao seu dia a dia de forma rápida e prática. E você, utiliza ou possui alguma outra ferramenta para substituir o prompt de comando do Windows? Conta pra gente sua experiência e o por que de sua escolha, adoraríamos saber sobre. 🙂

JUNTE-SE A MAIS DE 150.000 PROGRAMADORES