Laravel PHP en Ubuntu

By Tomás Hernández, Posted on February 20, 2024 (7mo ago)

Laravel y PHP en Ubuntu

He usado PHP en el pasado, y puedo decir que nunca me ha gustado trabajar con él profesionalmente. Sin embargo, me gusta utilizarlo para side-projects personales porque me gusta utilizar lenguajes que son server-side y me permiten hacer aplicaciones full-stack.

Siempre me ha quedado pendiente probar Laravel y NativePHP.

Acá voy a ir anotando lo que vea para poder levantar proyectos de Laravel en Ubuntu. Estoy usando Ubuntu en Windows, o, mejor llamado WSL.

Mi idea es usar un S.O de Linux y no estar con Windows porque al estar tan acostumbrado a los comandos de Linux, digamos que Windows me trae muchos problemas jeje.

Instalando WSL / Ubuntu

Si estás en Windows lo descargás desde la Store como "Ubuntu" Tené en cuenta que al principio te va a pedir que elijas un usuario root y le pongas una contraseña. Es importante que no sea cualquier contraseña porque la vas a necesitar en comandos ejecutados con sudo (super user)

⚠️

Las instalaciones que haré a continuación, TODAS estarán hechas sobre Ubuntu.

Actualizando los paquetes del sistema

Necesitamos ejecutar esto para traer las versiones de los paquetes actualizadas. Es obligatorio, aún cuando recién instalamos Ubuntu.

1. sudo apt-get update

Instalando PHP

1. sudo apt install php libapache2-mod-php
2. sudo apt install php-cli
3. sudo apt install php-pgsql -> Porque voy a querer usar una base de datos de Postgres en Docker
⚠️

Si al ejecutar php --version no nos arroja un error, entonces estamos bien.

Si la instalación de PHP salió bien, se mostraría algo así:

PHP Warning:  PHP Startup: Unable to load dynamic library 'xmlreader.so' (tried: /usr/lib/php/20210902/xmlreader.so (/usr/lib/php/20210902/xmlreader.so: undefined symbol: dom_node_class_entry), /usr/lib/php/20210902/xmlreader.so.so (/usr/lib/php/20210902/xmlreader.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning:  Module "xml" is already loaded in Unknown on line 0
PHP Warning:  Module "xmlwriter" is already loaded in Unknown on line 0
PHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.14, Copyright (c), by Zend Technologies 

Instalando Composer

Si venís de JavaScript, conocerás a Node. Node nos proporciona NPM (Node Package Manager), que es una manera de instalar paquetes.

También existen yarn, pnpm y bun. Pero para instalar estos, sí o sí necesitamos de node.

Acá, en PHP usamos Composer.

⚠️

Laravel utiliza node también. Así que acá manejaríamos composer/npm

Instalación de CURL

Para instalar Composer, necesitamos descargarlo vía curl.

1. sudo apt-get install curl
2. sudo apt-get install php php-curl
⚠️

Es posible espeficar la versión del paquete de php-curl. De la manera que lo dejé yo, la detecta automáticamente. Ej: sudo apt-get install php8.1-curl instala curl para la versión de php8.1

Instalación de php-xml

Este paquete lo necesita Laravel

1. sudo apt-get install php-xml

Instalación de Composer

1. sudo curl -s https://getcomposer.org/installer -o composer-setup.php
2. sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
3. sudo composer self-update
⚠️

Si al ejecutar composer -v no nos arroja un error, entonces estamos bien.

Si la instalación de Composer salió bien, deberían de ver algo como esto al ejecutar composer -v:

PHP Warning:  PHP Startup: Unable to load dynamic library 'xmlreader.so' (tried: /usr/lib/php/20210902/xmlreader.so (/usr/lib/php/20210902/xmlreader.so: undefined symbol: dom_node_class_entry), /usr/lib/php/20210902/xmlreader.so.so (/usr/lib/php/20210902/xmlreader.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning:  Module "xml" is already loaded in Unknown on line 0
PHP Warning:  Module "xmlwriter" is already loaded in Unknown on line 0

Acá abajo debería decir COMPOSER en grande, como un dibujito

Habilitar HTTPS para descarga de paquetes en Composer

Seguramente, este comando les salve la vida a más de uno.

Si estás experimentando que al crear un proyecto con Laravel, la instalación se queda como trabada en el proceso de "Loading composer repositories with package information" la solución es forzar a Composer en usar HTTPS.

1. sudo composer config --global repo.packagist composer https://packagist.org

Nuestra primera aplicación en Laravel

Para seguir la convención de la época del FileZilla, creemos nuestro proyecto en /var/www

cd /var/www

Ahora, para crear el proyecto de Laravel

1. sudo composer create-project laravel/laravel nombreDeTuApp

Si todo sale bien, el último mensaje en mostrarse debería ser

@php artisan key:generate --ansi
INFO  Application key set successfully.

Iniciando servidor de desarrollo en Laravel

Si por algún motivo, te moviste de la carpeta del proyecto:

cd /var/www/nombreDeTuApp

Y ahora, para ejecutar el proyecto:

1. php artisan serve

Por último, deberíamos de ver un mensaje de este tipo:

INFO Server running on "http://127.0.0.1:8000"

Si nos dirigimos en nuestro navegador web a esa URL, verán la aplicación de Laravel corriendo

Solucionando problemas de escritura de archivos temporales

Un error común es que Laravel no tenga los permisos necesarios para poder escribir en determinadas carpetas del proyecto en el sistema operativo. Esto suele pasar MUCHÍSIMO cuando se usa PHP para escribir logs, modificar archivos, etc, etc. Esto es porque el usuario con el que se crea el proyecto no es el nuestro, sino que se crea como root. Por más que sea root, hay que darle permisos a su usuario o a www-data. Lo más estándar, sería darle a www-data.

The stream or file '/var/www/native-php-example/storage/logs/laravel.log' could not be opened in append mode: Failed to open stream: Permission denied The exception occurred while attempting to log: The stream or file '/var/www/native-php-'
Error de permisos de Laravel con Ubuntu para escribir un log
file_put_contents(/var/www/native-php-example/storage/framework/sessions/80KCj8z1AzPSmxsqWTqgEFLPM4S0m39gbA3jXImK): Failed to open stream: Permission denied
Error de permisos de Laravel con Ubuntu

Para hacer esto, le damos a toda la carpeta de forma recursiva permisos de www-data.

Vayamos a la carpeta que contiene el proyecto: cd /var/www/nombreDeTuApp

Deberías tener algo parecido a esto:

tuUsuario@idDeTuPC:/var/www/nombreDeTuApp

Si colocan el comando de sudo ls -l deberían ver todas las carpetas del proyecto, como por ejemplo: README.md, app, artisan, bootstrap, etc.

1. sudo chown -R tuNombreDeUsuario:www-data storage 
2. sudo chown -R tuNombreDeUsuario:www-data bootstrap/cache

Ojo con el segundo comando, hagan un cd bootstrap
Tiren un sudo ls -l y vean si el usuario que tiene a bootstrap/cache cambió a tuNombreDeUsuario:www-data
Ej: drwxrwxr-x 2 tomihq   www-data 4096 Feb 20 23:37 cache

Si no llegase a estar de esa forma, ejecuten

sudo chown -R tuNombreDeUsuario:www-data cache

Donde dice tuNombreDeUsuario tenés que poner tu usuario de Ubuntu.

Ahora, volvé a la raíz del proyecto, es decir, cd ../ o cd /var/www/nombreDeTuApp si estabas mal parado.

tuUsuario@idDeTuPC:/var/www/nombreDeTuApp

Si todo salió bien, ejecutá

php artisan serve

y tendrías que ver algo así:

Pantalla inicial de Laravel al iniciar el proyecto

Abriendo nuestro proyecto con Visual Studio sabiendo que el proyecto está en Ubuntu

cd /var/www
sudo chown -R tuUsuario:www-data /var/www/nombreDeTuApp
sudo chmod 775 nombreDeTuApp

En Visual Studio code descargamos una extensión llamada WSL

WSL en Visual Studio Code

Luego, apretamos CTRL + SHIFT + P y buscamos "Remote Explorer"

A la izquierda, se abrirá un menú.

Seleccionamos el que se llama "Ubuntu" clickeando la ventana con el + por encima que tiene. Esta opción nos abrirá un Visual Studio ya ubicado en nuestro servidor de Ubuntu.

WSL en Visual Studio Code, remote explorer

Por último, en el explorador del Visual Studio Code que se nos abrió, clickeamos "Open Folder". Verá que aquí recomendará "/home/tuUsuario" pero nosotros tenemos que ir a "/var/www/nombreDeTuApp".

WSL en Visual Studio Code, remote explorer buscando la carpeta de nuestro proyecto.

Una vez que te ubicaste bien en esa ruta, vas a ver que te muestra todos los archivos del proyecto. Si estás ahí mismo parado, entonces ahora tocá "OK".

⚠️

Si no ves NINGÚN ARCHIVO del proyecto, es porque los permisos que le diste al proyecto en Ubuntu están mal. Procurá que sea de tipo 775.

Si todo está bien, vas a ver la terminal de bash (ubuntu) y los archivos correspondientes:

WSL en Visual Studio Code, remote explorer. Configurando el VSCODE

¡Ahora lo único que falta es, ejecutar en la terminal el comando de php artisan serve!

PHP ARTISAN SERVE en Ubuntu abierto desde Visual Studio Code