Laravel is more than a PHP file
Deploying Laravel well means deploying more than the web process. A real Laravel app in production usually has:
- The web process (PHP-FPM behind Nginx, or a long-running server via Octane).
- A queue worker (
php artisan queue:work) for jobs. - A scheduler (
php artisan schedule:runevery minute, the Laravel cron entrypoint). - Migrations run on deploy (
php artisan migrate --force). - A cache/session store (Redis is the usual choice).
- A database (MySQL or Postgres).
If a host only runs your web process, you've only solved a third of the problem. The questions that actually separate hosts: can you run workers and a scheduler, and is there a managed database and Redis nearby?
The platforms
Laravel Cloud / Forge
The first-party options. Forge provisions and manages servers on your own cloud account (DigitalOcean, AWS, etc.) and knows Laravel's needs intimately — queues, scheduler, deploy scripts, zero-downtime deploys. Laravel Cloud is the managed PaaS from the Laravel team. If you want the most Laravel-native experience and don't mind being in that ecosystem, these are the obvious picks. Check current pricing on their sites.
Render and Railway
Both host PHP well and let you define multiple process types (web + worker), plus managed Postgres/MySQL and Redis. You'll write a small amount of config to declare the worker and scheduler, but it's straightforward modern PaaS.
Traditional managed PHP hosts
Kinsta, Cloudways, and similar offer managed PHP/Laravel hosting with the LAMP/LEMP stack handled for you. They're a comfortable fit if you want a more "managed VM" feel with support, and many handle the scheduler cron for you. The trade-off is they're less git-push-native than the modern PaaS crowd.
PandaStack
Disclosure: my platform. PandaStack runs Laravel as a container app. Bring a Dockerfile (recommended for PHP so you control the FPM/Nginx/Octane setup) and connect the repo:
FROM php:8.3-fpm
RUN docker-php-ext-install pdo pdo_mysql bcmath
WORKDIR /var/www
COPY . .
RUN composer install --no-dev --optimize-autoloader
# Run your preferred server (php-fpm + nginx, or Octane)The scheduler is a natural fit for PandaStack's cronjobs — instead of a per-minute cron hack, schedule php artisan schedule:run, and run a separate web service as a long-lived queue worker. Add a managed MySQL (5.7/8.x) or PostgreSQL, plus managed Redis for cache/queues, and your DATABASE_URL is injected automatically. You get live logs, custom domains with automatic SSL, and rollbacks.
Honest limits: there's no Laravel-specific tooling the way Forge has (no one-click "Laravel" recipe), so you configure the runtime yourself via Docker. Newer platform, growing ecosystem. Free-tier apps cold-start on preemptible nodes.
A correct deploy sequence
The order matters for Laravel, especially with multiple replicas:
composer install --no-dev --optimize-autoloader
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan migrate --force # run once, not per-replica
php artisan queue:restart # tell workers to reloadRun migrations as a one-shot deploy step, not in each container's entrypoint — otherwise N replicas race to migrate. On PandaStack a cronjob or a one-off job is a clean place for this.
Process layout cheat sheet
| Process | Command | Notes |
|---|---|---|
| Web | php-fpm / Octane | Scale horizontally |
| Queue worker | php artisan queue:work --tries=3 | Separate service; scale by load |
| Scheduler | php artisan schedule:run | Run every minute (cronjob) |
| Migrations | php artisan migrate --force | One-shot on deploy |
Performance notes
- Octane (Swoole/RoadRunner) keeps the app booted between requests and is a big throughput win, but it changes the memory model — watch for state leaking between requests.
- OPcache should be on in production; it's the single biggest free PHP speedup.
- Put sessions and cache in Redis, not the database, under load.
- Use a CDN for
public/assets; don't serve them through PHP.
References
- [Laravel deployment documentation](https://laravel.com/docs/deployment)
- [Laravel Octane](https://laravel.com/docs/octane)
- [Laravel queues](https://laravel.com/docs/queues)
- [Laravel task scheduling](https://laravel.com/docs/scheduling)
- [PHP OPcache configuration](https://www.php.net/manual/en/book.opcache.php)
---
If you want app + MySQL + Redis + a scheduler in one place, PandaStack's free tier covers a web service, a managed database, and cronjobs. Try a Laravel deploy at [dashboard.pandastack.io](https://dashboard.pandastack.io).