Laravel Herd - El entorno ideal para el desarrollo en PHP en MacOS y Windows

Video thumbnail

La opción recomendada para utilizar en vez de Laragon en el desarrollo de aplicaciones en MacOS y Windows es la de Laravel Herd que viene siendo el equivalente de Laragon pero para MacOS y Windows, con Laravel Herd tenemos disponibles un ambiente en el cual desarrollar en Laravel y podemos instalar y varias versiones de dependencias como una base de datos o PHP; la pagina oficial viene siendo esta:

https://herd.laravel.com/

Una vez instalado, tendremos un panel como el siguiente:

Laravel Herd
Laravel Herd
Video thumbnail

Ahora, vamos a instalar un módulo adicional para gestionar las base de datos:

https://dbngin.com/

Una vez instalado, tendremos una ventana como la siguiente:

Laravel Herd, ventana escritorio
Dbngin, ventana escritorio

También habilitados que se inicie al momento de iniciar secion y que se anexe a la barra:

Dbngin, ventana barra
Dbngin, ventana barra

Desde la ventanas anteriores, podemos dar click al icono de + y crear una base de datos:

Crear una base de datos
Crear una base de datos

En la cual, solamente tenemos que colocar el nombre de la base de datos y el servicio que quieras emplear, en este curso, emplearemos MySQL.

Una vez creada la base de datos, tenemos acceso directo al manejador que tengamos instalado, en este ejemplo, el de Table Plus.

Instala Extensiones Adicionales en Laravel Herd

Vamos a conocer como podemos agregar extensiones adicionales empleando Laravel Herd el cual es el nuevo ambiente de desarrollo de Laravel a partir de la versión 10 en MacOS y 11 de Laravel para Windows; es un entorno muy similar al que tenemos en Laragon con Windows, en donde podemos instalar y gestionar dependencias de Laravel como lo son PHP, Node, entre otros.

Extensiones Adicionales en Laravel Herd

Como es normal en el desarrollo de software, muchas veces es necesario instalar extensiones adicionales con el cual, poder emplear ciertas funcionalidades o instalar ciertos paquetes, así que, vamos a comenzar.

Instalación de Extensiones PHP Adicionales

Laravel Herd incluye las extensiones PHP necesarias para desarrollar en Laravel, pero, si queremos instalar dependencias adicionales, tienes que seguir los siguientes pasos:

Una vez descargado el DLL de la página la cual quieres instalar la extensión, simplemente debes de copiar la extensión en la carpeta dll de php en Windows.

En MacOS, podemos usar Homebrew:

brew install php

Para instalar una extensión:

pecl install [extension-name]

Luego, en ambos casos, ya sea Windows o MacOS, debes de activar la extensión desde el php.ini:

Herd/config/php/<version>/php.ini

Y esto es todo lo que necesitas saber para agregar extensiones a tu Herd; como puedes apreciar, los pasos son similares a cualquier otro ambiente como Laragon

Laravel Herd - Reparar errores 504 - 503 PHP y Nginx

Video thumbnail

Estaba haciendo unas operaciones en una aplicación en Laravel en modo producción. Como es habitual, en este entorno tengo ocultos los errores, y cualquier problema debería guardarse en un log.

Al realizar cierta operación, siempre se producía un error. Al principio era un 503, y luego se convirtió en un 504, lo cual era extraño porque no se generaba un log asociado.
Y eso es lo primero que debes revisar: si no se genera un log, puede ser que el problema no sea Laravel, sino otro componente, como PHP o el servidor web (Apache o Nginx, dependiendo de tu stack).

En mi caso, estoy utilizando Nginx. Ya más o menos sabía por dónde venía el problema: falta de recursos. A continuación, te explico cómo lo abordé.

Reproducción del error en desarrollo

Decidí replicar la operación en el entorno de desarrollo, donde tengo la ventaja de ver los errores directamente en pantalla.

Mi sorpresa fue que tampoco se generaba ningún log en desarrollo, lo cual reforzaba la hipótesis de que el problema no estaba en Laravel, sino en el servidor o en PHP.

Detectar el problema: operación + Error NO en pantalla/log

Con esa información, lo siguiente era analizar qué operación estaba ejecutando.
En mi caso, estaba generando un libro (como el que estás viendo en pantalla). Todos los libros los genero directamente en producción, donde tengo la data ya saneada.

Normalmente, esos libros tienen entre 400 y 500 páginas. Pero este en particular es un monstruo de 813 páginas, es decir, el doble del tamaño habitual.

Naturaleza del problema: recursos insuficientes

Esto implica dos cosas:

  1. La operación va a tardar bastante tiempo.
  2. Es mucho más pesada que las demás y demanda más recursos.

Por lo tanto, ya teníamos una idea más clara de cuál era el problema: una operación intensiva que excede los límites configurados por defecto.

Subir recursos de tiempo y memoria a PHP y nginx 

Dado que no había logs generados por Laravel, pero sí un comportamiento anómalo (error 504), el siguiente paso fue revisar los límites configurados en PHP.

En mi caso, uso Laravel Herd, que emplea Nginx, así que el enfoque era un poco distinto a usar Apache.

Lo primero que hice fue aumentar los recursos en el archivo php.ini. Esto es lo típico que se intenta cuando tienes operaciones pesadas:

C:\Users\<user>\.config\herd\bin\php8X

max_execution_time = 600
memory_limit = 1024M
post_max_size = 256M
upload_max_filesize = 256M

¿Cómo accedí al archivo php.ini en Laravel Herd?

En Laravel Herd es muy fácil:

  1. Vas al icono de PHP en la interfaz.
  2. Clic derecho sobre la versión activa.
  3. Seleccionas la opción: "Open php.ini in directory".

Una vez abierto, buscas las líneas correspondientes y las modificas.

Después de hacer esos cambios... no funcionó.

Subir recursos de tiempo y memoria a Nginx 

Como PHP no resolvió el problema, era momento de mirar más profundo en el servidor.

Pasé a revisar el archivo de configuración de Nginx. En Laravel Herd, esto se encuentra dentro de:

C:\Users\<user>\.config\herd\config\nginx\herd.conf

location / {
    rewrite ^ "C:/Program Files/Herd/resources/app.asar.unpacked/resources/valet/server.php" last;
    
    #MIAS
    proxy_read_timeout 3000;
    proxy_connect_timeout 3000;
    proxy_send_timeout 3000;

}

Sin embargo, tampoco funcionó.

Logs de Nginx

Entonces me fui al log del servidor Nginx, que está en:

C:\Users\<user>\.config\herd\Log

Aquí es donde sí encontré información útil. Al revisar el log, me indicaba claramente que era un timeout, lo cual no aparecía en los logs de Laravel:

[error] 616#35124: *1 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream, client: 127.0.0.1, server: , request: "POST /livewire/update HTTP/1.1", upstream: "fastcgi://127.0.0.1:9084", host: "xx.test", referrer: "http://xx.test/dashboard/books/edit/1"

Copié el mensaje del error y se lo pasé a ChatGPT (aunque también podrías buscarlo en Google).

Esto me ayudó a confirmar que el problema era un timeout, y que los parámetros a modificar no eran solo los del php.ini, sino también los del archivo de configuración de Nginx.

Configuración final que solucionó el problema
Ajusté las siguientes líneas en Nginx:

C:\Users\<user>\.config\herd\config\nginx\herd.conf

location ~ [^/]\.php(/|$) {
    ***
    #MIAS
    fastcgi_read_timeout 600;
    fastcgi_send_timeout 600;
    send_timeout 600;
}

Mi Kit de Desarrollo para Laravel 2025 - Windows y MacOS

Mi Kit de Desarrollo para Laravel 2025 - Windows y MacOS
Video thumbnail

Debido a que Laragon ya no es gratuito, ya no te recomiendo que lo utilices para desarrollar. Tenemos otras herramientas que podrías emplear, como Docker directamente. Aunque sinceramente, para desarrollar con Laravel, Docker nunca me ha gustado demasiado, ya que es un poco más laborioso el asunto. Sin embargo, es completamente utilizable.

Si te va bien trabajar con Docker, recuerda que puedes usarlo junto con Laravel Sail, que funciona perfectamente tanto en Windows como en Mac (y creo que también en Linux, ya que Docker es multiplataforma). Pero como te digo, ya no te recomiendo usar Larragon bajo ningún concepto, a menos que quieras pagar o necesites alguna característica específica que realmente valga la pena. De lo contrario, para trabajar con Laravel, no hace falta.

Alternativa recomendada: Laravel Herd

El enfoque que te recomiendo ahora es Laravel Herd. Recuerda que está disponible tanto para Windows como para Mac. Incluso, inicialmente salió para Mac y luego fue lanzado para Windows. Así que tienes soporte en ambos sistemas.

¿Y la base de datos?

Ese siempre fue el "talón de Aquiles" con Herd, ya que Laragon incluía automáticamente MySQL o MariaDB. Para suplir eso, puedes usar DBngin, que es otra herramienta que, si mal no recuerdo, al principio solo estaba disponible para Mac, pero ahora también está en Windows.

Es por eso que quise grabar este video: para mostrarte el kit de desarrollo que te recomiendo para 2025 con Laravel.

Kit de desarrollo Laravel 2025

Ya sea que estés usando Mac o Windows, puedes emplear ambas herramientas perfectamente. Aquí puedes ver que me funcionan sin problema: tengo Laravel Herd con mis proyectos y, por otro lado, DBngin funcionando sin inconvenientes.

Ojo: también podemos trabajar con Laravel sin necesidad de una base de datos como MySQL, ya que por defecto viene con SQLite, que me parece excelente. De hecho, es la que usualmente utilizo en los cursos.

¿Por qué prefiero MySQL en proyectos reales?

Personalmente, cuando trabajo en proyectos reales, que sé que van a crecer en tablas, migraciones y modelos, prefiero usar MySQL porque me permite editar, personalizar o cambiar la base de datos de una manera más sencilla.

Con SQLite, cambiar una base de datos puede ser un dolor de cabeza. Me ha pasado en cursos donde, por ejemplo, olvidé una letra en una tabla, y tengo que modificarla o agregar una nueva columna. Sí, eso se puede hacer con migraciones, y de hecho, ese es el enfoque recomendado con cualquier framework moderno.

Pero cuando estoy con un proyecto real, y tengo la necesidad de modificar o crear migraciones constantemente para simplemente cambiar una tabla, prefiero hacerlo de forma manual.

El problema es que para reflejar esos cambios con migraciones, muchas veces hay que hacer un migrate:refresh, lo cual elimina todas las tablas y las recrea. Esto no es viable en un proyecto en producción.

Por eso, prefiero aplicar los cambios manualmente en la base de datos y, si es necesario, generar el SQL correspondiente para ejecutarlo directamente en el entorno de producción. Algo que con SQLite sería un poco más complicado.

Conclusión: Mi entorno ideal

Entonces, el objetivo de este video era mostrarte mi entorno de desarrollo recomendado para Laravel en 2025:

  1. Laravel Herd
  2. DBngin
  3. (Opcional) TablePlus como gestor visual de bases de datos, el cual también puedes instalar. Aunque puedes usar cualquier otro, con DBngin ya viene con acceso directo configurado.

Resumen

  • Identifica la operación que causa el error.
  • Si no hay logs en Laravel, puede ser problema de PHP o del servidor.
  • Ajusta primero los parámetros de php.ini: max_execution_time y memory_limit.
  • Si no funciona, pasa a revisar los archivos de configuración de Nginx.
  • Usa el log del servidor para obtener más pistas.
  • Ajusta los timeouts en Nginx si es necesario.
  • Siempre comenta tus cambios y haz copias de respaldo antes de modificar archivos críticos.

Acepto recibir anuncios de interes sobre este Blog.

Laravel Herd que viene siendo el equivalente de Laragon pero para MacOS, con Laravel Herd tenemos disponibles un ambiente en el cual desarrollar en Laravel y podemos instalar.

| 👤 Andrés Cruz

🇺🇸 In english