15

We have two different pods in Kubernetes for our Laravel app,

  • one running apache serving on port 80, (CMD /usr/sbin/apache2ctl -D FOREGROUND)
  • and another running worker (Laravel Horizon) (CMD php /var/www/artisan horizon)

The issue is when I check the horizon dashboard, it says 'Active', and I can see the Jobs in the 'Pending Jobs' section, but they never actually execute. They are just sitting there idle.

Now, when I SSH in the pod running apache and manually and run the command 'php artisan horizon' than it actually executes all pending jobs.

I have already ensured the followings:

  1. Both the pods are connected with the same Redis database service
  2. Horizon Prefix is the same for both the pods
3
  • I think you should run it with supervisor, install a supervisor in a container then executre the containers see what happens. Commented Jun 6, 2020 at 19:19
  • @AdnanMumtaz I tried, but nothing changed. Commented Jun 6, 2020 at 19:55
  • See also stackoverflow.com/questions/47813800/… Commented Aug 27, 2021 at 21:24

6 Answers 6

25

Double check your APP_ENV matches one of the environments in the horizon.php config. Otherwise horizon will not start any queue workers.

By default only local and production environments are provided:

https://laravel.com/docs/8.x/horizon#environments

Sign up to request clarification or add additional context in comments.

1 Comment

In my case I had PRODUCTION instead of production - so remember it's case sensitive.
11

After struggling for days, I got the answer to this problem.

While using Redis as a cache, queue, or broadcast broker in the docker environment, we need to make sure that the following environment variables are defined properly and they must be the same across all the pods.

  • CACHE_PREFIX
  • REDIS_PREFIX
  • REDIS_CACHE_DB
  • HORIZON_PREFIX

Hope this will help others trying to deploy the Laravel apps using Kubernetes and Docker.

8 Comments

i'm running into the same issue. what type of redis are you using? we're trying an enterprise edition. doesn't seem to be working. anything else i should check. the env vars are exactly the same on both the API and the horizon "queue worker" pod
@aibarra , I know its really late, hopefully, you might have figured it out yet. Just to answer you, I think the type of Redis doesn't matter, until or unless all your applications (all microservices) are talking with the same Redis instance. And if you already have the solution, it would be great if you can share it here, it can help other. Thanks!
We were about to hit this issue and I stumbled to this post, gave a lot of heads up on the strategy, thanks
Good Point Also In config/database.php We need to put Seperate REDIS_DB for CACHE, EVENT, SESSION and HORIZON
wow, thanks I deleted those from .env relying on the default config, now I know they must stay!!!
|
6

In my case, I need to change my app environment from prod to production

APP_ENV=production

1 Comment

In my case I had PRODUCTION instead of production - so remember it's case sensitive.
2

In my case I added the jobs into "emails" queue, but horizon.php config file didn't specify this queue name for supervisor-1 :-)

Comments

0

If jobs or listeners send requests to external services and cannot reach destination hosts and the connection timeout value is set to something very big or job timeout value is also set to a big value then the jobs might also be in pending state long enough so that it may seem that horizon is not executing them.

Comments

-2

I just restart Redis server

/etc/init.d/redis-server restart

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.