Running Laravel Horizon on shared hosting via CRON - laravel

I am running an application build on Laravel 8. This application handles heavy loads of jobs. That is why my queues are stored in Redis and handled by Laravel Horizon.
Since I am on shared hosting, I have no access to Supervisord (or to any process manager).
I am asking the community because I was unable to find any advice or recommendation on the preferred configuration for my case.
CRON
* * * * * php artisan schedule:run >/dev/null 2>&1
Console / Kernel.php
$schedule->command('horizon')->everyMinute()->withoutOverlapping();
What is the preferred method of keeping Horizon alive via CRON?
What is the preferred method to prevent Horizon duplicate processes (and to prevent memory leaks)?

Since you can run cron jobs, you could create a file 'start_horizon.php':
<?php declare(strict_types=1);
$res = shell_exec("php artisan horizon:status");
if($res !== "Horizon is running.\n") {
echo "horizon is not running, starting it\n";
$fp = popen("php artisan horizon", "r");
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
echo $buffer;
}
echo "horizon was terminated\n";
pclose($fp);
} else {
echo "horizon is running\n";
}
and call it from cron every minute or so. This script will check if horizon is running. If horizon running, it will exit. If horizon is not running, it will start horizon.
The cron line should look like this:
* * * * * cd /your/laravel/dir/ && php start_horizon.php >> /dev/null
It is needed to run this script in a directory where artisan is available.

Related

Check if Task Scheduling works on local, Laravel

I am using Task Scheduling from Laravel, on local env. and till now I test it with php artisan word:weeklyUpdate , but I want to check if the Cron Job run automatically on a specific date, like in my code.
protected function schedule(Schedule $schedule)
{
$scheduler = new LkpSchedulerUpdateDate;
$scheduler = $scheduler->first()->toArray();
$schedule->command('word:weeklyUpdate')->weeklyOn($scheduler->date, $scheduler->time);
//ex: weeklyOn(3, 05:49:00)
}
Create a schedule that runs just some minuts after the current time (let's say 5 minuts from now), wait, then check the results.
Edit:
It's because when you run php artisan word:weeklyUpdate` you execute the command directly.
The scheduled task your wrote is equivalent to execute php artisan word:weeklyUpdate in console every week.
Also, in your locale did you activated the cronJob scheduler?
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Laravel Scheduler not working in Dreamhost VPS

Laravel scheduler doesn't work in Dreamhost VPS.
Dreamhost has a limitation of not allowing every minute calls so I am doing it in a 10 minute call instead. However, the scheduler doesn't fire in any case.
I have tried the following cron commands:
php ~/site.com/artisan schedule:run >> /dev/null 2>&1
and
cd / site.com && php artisan schedule:run >> /dev/null 2>&1
But both do not work.
Here's what I have inside my kernel.php
protected $commands = [
'App\Console\Commands\DailyStatus',
];
/**
* Define the application's command schedule.
*
* #param \Illuminate\Console\Scheduling\Schedule $schedule
* #return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('status:daily')
->timezone('Asia/Manila')
->dailyAt('6:50');
$schedule->command('status:daily')
->timezone('Asia/Manila')
->daily()
->between('12:00','12:30')
->appendOutputTo(public_path().'status_daily_output.log')
->withoutOverlapping(60);
$schedule->command('status:daily')
->timezone('Asia/Manila')
->dailyAt('12:15')
->appendOutputTo(public_path().'status_daily_at_output.log')
->withoutOverlapping(60);
}
The logs are also not being generated. I have put some echo commands and its not firing.
How can I test if my scheduler is properly configured?
Can someone help me fix my current setting?
Thank you.
So I managed to get this to work after a number of testing.
Make sure that your account can execute the command
crontab -e
If you can't, contact Dreamhost support to have the permissions fixed.
For your cron command, you need to specify the exact location of your php
cd ~/site.com && /usr/local/php72/bin/php artisan schedule:run >> /dev/null 2>&1
Since everyminute is not allowed by Dreamhost, I suggest executing it at every 10 minutes instead.
I hope this helps!

Laravel scheduled job did not resume after maintance mode

I did a maintanace on my laravel app by php artisan down. Then again after 15 minutes I did php artisan up.
But the scheduled jobs have not still resumed. They are not being executed as it was before.
Schedueled jobs are not being executed even when I manually give the command. ex: php artisan my:command
I think by making logs of your cronjobs will help you.
First Method
remove this part from you cronjob
>> /dev/null
Now add log file path in you cronjob
* * * * * php /var/www/html/project/artisan schedule:run >> /var/www/html/project/mylog.log 2>&1
create a log file and this file 777 (writable) permission.
so you can check what actually happening
Second Method
Or you can use method appendOutputTo() in your kernal.php
$schedule->command('inspire')->everyMinute()->appendOutputTo($filePath);
$filePath is a path of a log file you can give a public path or storage path

How to check cronjob is working for laravel app in digital ocean server?

This is scheduling code in laravel.
Console .php
$schedule->command('mail:customer')->dailyAt('9:00 am');
$schedule->command('renew:booking')->dailyAt('9:00 am');
And I 'd like to run this on an Ubuntu server. I am just using crontab for email sending in laravel application. For this, I had used
* * * * * * php /var/www_testing/artisan schedule:run 1>> /dev/null 2>&1
This command in digital ocean server. But I am not sure if this is working or not. So I just need to check this is working. Is there exact and fast way for testing?
yes use facility of logs provided by laravel.
you can put something like this in your Job or Command whatever you have used.
public function handle()
{
Log::info('Cron Job Started');
// your logic
Log::info('Cron Job Ended');
}
This will put a log into Laravel.log file and if the cron is running perfectly you will get the log here..
Also you have syntax error here try this.
* * * * * php /var/www_testing/artisan schedule:run 1>> /dev/null 2>&1

How to setup Laravel 5's task scheduling in Heroku?

I'm trying to follow the Laravel Documentation on how to Run Cron Jobs,
and I want to add this
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
But I don't know how to add it to Heroku.
I created this Scheduler which runs once a minute and is part of your own app.
https://gist.github.com/robbydooo/65bf341ea0f4081150b945bfb1d38d3c
It creates a new Dyno type called Scheduler which you start one of.
Make sure you run jobs on your queue to avoid this scheduler over running once per minute.
To use this scheduler with Laravel 5.4+ add this file to /app/Console/Commands/RunScheduler.php
Register this file in app/Console/Kernel.php
protected $commands = [
…
Commands\RunScheduler::class
…
]
Add this line to your Procfile:
scheduler: php -d memory_limit=512M artisan schedule:cron
Heroku has a cron scheduler addon that you can use for scheduled tasks.
You can install it like this:
$ heroku addons:create scheduler:standard
Have a look at this article for more information.
It's been a while since this question was asked but recently I've had a similar issue and was able to overcome it using this blog post:
https://dev.to/autoidle/run-laravel-scheduled-jobs-on-heroku-2ah6
You can basically create a console command using this artisan generator:
php artisan make:command SchedulerDaemon
then you can edit app/Console/Commands/SchedulerDaemon.php and edit some lines as described below:
...
class SchedulerDaemon extends Command
{
...
// Change $signature value
protected $signature = 'schedule:daemon {--sleep=60}';
...
// Change $description value
protected $description = 'Triggers scheduler every minute or --sleep seconds interval';
...
public function handle()
{
// Change handle() function body to this:
while (true) {
$this->info('Calling scheduler');
$this->call('schedule:run');
sleep($this->option('sleep'));
}
}
...
}
Then, add this line to Procfile:
scheduler: php artisan schedule:daemon
And remember to enable scheduler process on heroku dashboard or run:
heroku ps:scale scheduler=1
I hope it becomes helpful to others in the future!
Cron To Go is an add-on that allows you to run Laravel's task scheduler every minute (* * * * * in cron). Simply install the add-on, add a job with * * * * * as the schedule and php artisan schedule:run as the command, sit back and relax! If your Laravel logs don't show up for the scheduler, there's a quick fix for log routing described here.
A free alternative can be to use the free worker dyno and configure it as follows in the Procfile
web: vendor/bin/heroku-php-apache2 public/
worker: bash -c "while [ true ]; do (php artisan schedule:run &); sleep 60; done"
This command creates a while loop for run schedule:run every minute.
Then you must exec heroku ps:scale web=1 worker=1 to enable worker dyno.

Resources