Cómo configurar un entorno de desarrollo PHP en el subsistema de Windows para Linux (WSL)

El desarrollo de PHP en Windows tiene algunas desventajas. Pero Microsoft ahora ofrece una gran opción para los desarrolladores de PHP que trabajan en Windows: el subsistema de Windows para Linux (WSL). WSL es una capa de compatibilidad para ejecutar ejecutables binarios de Linux (en formato ELF) de forma nativa en Windows 10. Microsoft dice:

“Esta es principalmente una herramienta para desarrolladores, especialmente desarrolladores web y aquellos que trabajan en o con proyectos de código abierto”.

Podemos ejecutar un entorno Linux directamente en Windows sin la sobrecarga de una máquina virtual.

Nota: este artículo no es solo para Windows Insiders. Estos métodos también funcionarán en las últimas versiones estables de Windows 10.

En este tutorial, configuraremos una pila LAMP (Ubuntu 16.04, Apache, PHP 7.1, MariaDB) en WSL para el desarrollo. Puede configurar otras pilas (por ejemplo, una pila LEMP) con métodos similares.

Prerrequisitos

Antes de comenzar esta guía, necesitará lo siguiente:

  • Una versión de 64 bits de Windows 10 con Creators Update o posterior.
  • familiaridad con Linux / bash (si desea familiarizarse con la línea de comandos, puede leer este tutorial de DigitalOcean).

Paso 1: instalar bash en Windows

Primero, necesitará WSL instalado en su computadora.

Puede instalar más distribuciones de Linux desde Microsoft Store (Ubuntu, openSUSE, SUSE Linux Enterprise Server 12). Pero, en este tutorial, configuraremos la pila LAMP en Ubuntu, por lo que debe seleccionar Ubuntu .

Microsoft tiene un excelente tutorial sobre cómo instalar WSL, siga las instrucciones del artículo.

Si ha instalado con éxito Bash en Ubuntu en Windows, instalemos y configuremos una pila LAMP simple para el desarrollo.

Paso 2: instalar un servidor HTTP Apache

Queremos instalar la última versión estable de Apache, pero los repositorios oficiales de Ubuntu no contienen la última versión.

Necesitamos agregar un PPA para los paquetes de Apache. Un archivo de paquetes personales (PPA) es un repositorio que permite a los desarrolladores externos crear y distribuir paquetes para Ubuntu. El PPA de Ondřej Surý ofrece los últimos paquetes de Apache / PHP para Ubuntu.

Para agregar el PPA, ejecute el siguiente comando en WSL bash:

sudo add-apt-repository ppa:ondrej/apache2

Una vez configurado el PPA, actualice el índice del paquete local:

sudo apt-get update

Instale Apache:

sudo apt-get install apache2

Cree una carpeta de proyecto para sus aplicaciones web. Esta carpeta debe estar fuera del sistema de archivos WSL. Te recomiendo que uses tu carpeta Documentos.

El siguiente comando creará una carpeta de servidor dentro de su directorio de Documentos. Reemplace SU NOMBRE DE USUARIO DE WINDOWS con su nombre de usuario de Windows.

sudo mkdir /mnt/c/Users/YOUR WINDOWS USERNAME/Documents/server

Crea un enlace simbólico a la carpeta seleccionada.

sudo ln -s /mnt/c/Users/YOUR WINDOWS USERNAME/Documents/server /var/www/devroot

Abra el archivo de configuración del host virtual predeterminado de Apache:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Modifique la raíz del documento a “/ var / www / devroot”, que apunta a la carpeta de su proyecto fuera del sistema de archivos de WSL. Establecer ServerNameen localhost(si el puerto 80 está reservado por una aplicación de Windows, reemplace 80 con un puerto no utilizado)

 ServerName localhost ServerAdmin [email protected] DocumentRoot /var/www/devroot  Options Indexes FollowSymLinks AllowOverride All Require all granted  ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined

Cuando haya terminado, guarde el archivo presionando Ctrl-O y presione Enter para confirmar. Salga con Ctrl-X.

Abra su editor / IDE de Windows favorito y cree un archivo "index.html" en la carpeta de su proyecto (C: \ Usuarios \ SU NOMBRE DE USUARIO DE WINDOWS \ Documentos \ servidor) con el siguiente contenido:

  It works!

It works!

Inicie el servidor HTTP Apache:

sudo service apache2 start

Abra // localhost / en su navegador y debería ver el título "Funciona".

No olvide habilitar los módulos de Apache que sean necesarios para usted. Por ejemplo, puede habilitar mod_rewrite:

sudo a2enmod rewritesudo service apache2 restart

Paso 3: instalar el servidor MariaDB

Agregue un repositorio que contenga los últimos paquetes MariaDB:

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] //ams2.mirrors.digitalocean.com/mariadb/repo/10.2/ubuntu xenial main'

Instale MariaDB:

sudo apt-get updatesudo apt-get install mariadb-server

Se le pedirá que cree una contraseña de root durante la instalación. Elija una contraseña segura y recuérdela, porque la necesitará más adelante.

Inicie MariaDB:

sudo service mysql start

Ejecute el siguiente script (esto cambia algunas de las opciones predeterminadas menos seguras):

mysql_secure_installation

Paso 4: instalar PHP

Agregue PPA para el PHP más reciente:

sudo add-apt-repository ppa:ondrej/phpsudo apt-get update

Instale paquetes PHP 7.1:

sudo apt-get install php7.1 libapache2-mod-php7.1 php7.1-mcrypt php7.1-mysql php7.1-mbstring php7.1-gettext php7.1-xml php7.1-json php7.1-curl php7.1-zip

Tenemos que reiniciar Apache:

sudo service apache2 restart

Create an info.php file in your project folder with the following content:


    

Open //localhost/info.php in your browser. If PHP works correctly, you should see the following:

Step 5: installing phpMyAdmin

phpMyAdmin is a free and open source administration tool for MySQL and MariaDB.

With phpMyAdmin, you can easily create/manage your databases using a web interface.

sudo apt-get install phpmyadmin
  • When the first prompt appears, press Space, Tab, and then Enter to select Apache.
  • Select yes when asked to use dbconfig-common to set up the database.
  • Provide your MariaDB root password
  • Choose a password for the phpMyAdmin application itself

Enable the necessary PHP extensions:

sudo phpenmod mcryptsudo phpenmod mbstring

Restart Apache:

sudo service apache2 restart

Now you can access phpMyAdmin on the following URL: //localhost/phpmyadmin/

You can login using the root username and the root password you set up during the MariaDB installation.

Step 6: installing Composer

Composer is a package manager for PHP. It allows you to install/update the libraries your project depends on. If you are a PHP developer you probably use composer.

Visit Composer’s download page and follow the instructions in the Command-line installation section. After Composer has installed successfully, you can install it globally:

sudo mv composer.phar /usr/local/bin/composer

Now it can be run from any location by typing:

composer

Step 7: installing Git:

Git is a version control system which is primarily used for source code management. Learn more about Git here.

You can install it by running the following command:

sudo apt-get install git

Before you use Git (and if you aren’t familiar with it), please read the “How To Set Up Git” section from the How To Install Git on Ubuntu 16.04 tutorial.

Step 8: automatically start LAMP on WSL (optional)

Background tasks are currently not supported on WSL. When you close Bash your services (Apache and MariaDB) will stop.

Note for Windows Insiders: Background tasks are now supported on WSL starting with Windows Insider Build 17046 (for more details, you can read the following blog post: Background Task Support in WSL), but the auto start of services is still not available.

Unfortunately, automatically starting your services is a bit difficult.

Let’s configure autostarting!

We need to start the services without typing your password.

Before you get started with this, please take a look at the following tutorial How To Edit the Sudoers File on Ubuntu and CentOS.

Run the following command:

sudo visudo -f /etc/sudoers.d/services

Copy and paste the following to the editor and then save:

%sudo ALL=(root) NOPASSWD: /usr/sbin/service *%wheel ALL=(root) NOPASSWD: /usr/sbin/service *

This enables us to start the services (like Apache and MariaDB) without using our password.

Start Command Prompt (not the bash) as administrator and run:

SchTasks /Create /SC ONLOGON /TN "Start WSL LAMP" /TR "c:\Windows\System32\bash.exe -c 'sudo service apache2 start; sudo service mysql start; cd ~; bash'"

The above command creates a task that runs automatically when you login to Windows. It does the following:

  • Starts Apache
  • Starts MariaDB
  • Changes the directory to your home directory

Don’t forget: when you close the terminal window, services will stop and you should restart them manually!

Step 9: add test domains (optional)

When you work on more web applications, multiple test domains will be helpful. For example, if you are working on myapp.com, you can access the local development version on //myapp.test/ instead of //localhost/myapp.

In the following, you can replace “myapp” with your web application’s name.

Create a folder in your projects directory for your web application:

sudo mkdir /mnt/c/Users/YOUR WINDOWS USERNAME/Documents/server/myapp

Add the virtual host file to Apache:

sudo nano /etc/apache2/sites-available/myapp.test.conf

Save the following configuration to the new file (don’t forget to replace myapp with your application’s name).

ServerName myapp.test
ServerAdmin [email protected] DocumentRoot /var/www/devroot/myapp
 Options Indexes FollowSymLinks AllowOverride All Require all granted 
ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined

Enable the new site:

sudo a2ensite myapp.test

Restart Apache:

sudo service apache2 restart

Finally, start Notepad or your favorite editor/IDE on Windows with admin privileges (Run as administrator) and open the hosts file. It is located in the c:\windows\system32\drivers\etc folder.

Add the following line to the end of the file and save it:

127.0.0.1 myapp.test

Now you can access your web application on the //myapp.test/ domain.

You can also add more test domains with the same method.

Conclusion

WSL does not replace Vagrant or Docker, and it is experimental. Automatically starting services is currently not supported on WSL, and this is one of the biggest problems with it at this moment. However, the Windows Subsystem for Linux is a great option for developers to use a native Linux shell on Windows. I think you should give it a try!