A Cron Job in Laravel 4 - php

I need a Cron job for execute a Scraper to a Website and send emails with the information, I made a Controller to do that, but when I set up the command to run that file
php app/controllers/ScraperController.php
I get this error
PHP Fatal error: Class 'BaseController' not found in
/var/www/U-Scraper/app/controllers/ScraperController.php on line 2
The thing is, it works when I set up with a route to that controller

Controllers don't run by themselves, they work as a component of Laravel. If you're loading your controller directly then Laravel is not being loaded and as far as PHP is concerned BaseController, as well as Laravel's Controller class, does not exist. Normally your web server loads public/index.php which loads Laravel and so on. If that's confusing you may want to learn about how autoloading with Composer works: http://net.tutsplus.com/tutorials/php/easy-package-management-with-composer/
What you should do is write an Artisan command that does what you need and call that command using cron. This question gives details on how to accomplish this: Cron Job in Laravel

I suggest you to create new Artisan command instead of controller.
Then set CRON task to run your command, for example:
1 * * * * /usr/bin/php /path/to/the/artisan nameofthecustomcommand
If you cannot run/set task this way, but you can set the URL to execute
http://mydomain.com/cron.php
// cron.php
// I am aware I do use exec()
exec('php artisan nameofthecustomcommand');
More about Artisan commands here
There is a chance, you can put whole controller method into this command without having to touch the code ;)

This is the way i've setup CRON jobs using Laravel 4 and the Artisan Command function.
Firstly, create a new command using Artisan. From the command line type:
php artisan command:make FooCommand
In your app/commands folder you will now have a new file called FooCommand.php.
Open that file up and write your code in the function fire(). This will run every time your command runs. There are some other functions that allow you to capture arguments and options from the command line.
In your command file there are also $name and $description variables that need to be filled in. Give your task a nice name and description like:
/**
* The console command name.
*
* #var string
*/
protected $name = 'command:my_foo_command';
/**
* The console command description.
*
* #var string
*/
protected $description = 'A description of what the command does';
Once you've finished you need to register it to Artisan by opening up app/start/artisan.php and adding:
Artisan::add(new FooCommand);
Then using Artisan in the command line you can run your task using:
php artisan command:my_foo_command
This will only invoke the command once - to get it running on a regular basis add the following to your CRONTAB:
1 * * * * /usr/bin/php /path/to/the/artisan command:my_foo_command

Related

How can I run a seeder from a cronjob in Laravel?

I need to run a seeder what it takes a time to execute (like five minutes). But i set it in my crontab as:
0 0 * * * php /var/www/.../api/artisan db:seed --class=ApiPlayerStatisticsSeeder
And it does not run by itself. Looks like it need an user to execute. So, how i can run this seeder in background?
I tried making a comand and run in backgruound like a task in kernel file (https://laravel.com/docs/5.8/scheduling#scheduling-artisan-commands), but it doesn't work either.
I use the laravel command scheduling on a daily basis. ill barebones how I insert a command to the schedule
$schedule->exec('php artisan command:here --flags 4434 --params 32')
->weeklyOn(3,'9:30');
the command:here is just whatever command you have written to complete your task. Same goes with 'flags' or 'params' if you dont need them or dont set them up then dont use them.
weeklyOn can be changed to hourly() everyfiveminutes(), monthly(), quarterly, etc please check the docs for the syntax
On your cronjob, first cd into your app's directory and then call the artisan command. Like so:
0 0 * * * cd /path/to/app && php artisan db:seed --class=ApiPlayerStatisticsSeeder
Let me know if it worked.

Laravel cron on Digitalocean

I have set up Laravel scheduler to run my custom commands at specific time. Now I wanted to set up cron on Digitalocean server to trigger schedule:run each minute to check if something is scheduled at the given time.
After initial SSH-ing to server, I have run crontab -e and added the following line to it:
* * * * * php /var/www/Laravel artisan schedule:run >> laravel_cron.log
but the problem I'm facing is that I don't see anything written in laravel_cron.log, but it does get created, so now I have no idea whether my commands will actually be ran.
To test it out, I have tried entering php /var/www/Laravel artisan but I get no output in command line.
If I change the route to say xyz/www/Laravel it is saying that it can't find it, so I guess the route is set up fine. Also when I manually go to the Laravel folder and run php artisan without the route in the middle, I get the standard output.
I believe the command php /path/ artisan schedule:run does not return any output.
If you want to log the output of a task, you can use sendOutputTo or emailOutputTo
e.g.
$schedule->command('foo')
->daily()
->sendOutputTo($filePath)
->emailOutputTo('foo#example.com');
More examples can be found here

Laravel "No scheduled commands are ready to run."

I've set up the following Laravel commands on the App\Console\Kernel:
protected function schedule(Schedule $schedule) {
$schedule->command('command:daily-reset')->daily();
$schedule->command('command:monthly-reset')->monthly();
}
Then, on my server, I've set up a cron job to run once per day (at 00:00).
0 0 * * * php /home/privates/public_html/staging/current/artisan schedule:run
My cron job is running successfully each night, but the logs simply say: "No scheduled commands are ready to run."
What am I doing wrong? I would expect my daily command to run each night.
Thanks!
When you run
php artisan schedule:run
in the server, where your project is stored, you could see all of your commands running with output, looking like this:
"Running scheduled command: '/usr/local/bin/php' 'artisan' cache:update > '/dev/null' 2>&1 &"
but only if the current time is the exact one, for which the command is scheduled. Otherwise you are going to see this output:
"No scheduled commands are ready to run."
For example, if you schedule the command for every five minutes and run the command in 09:07 o'clock you will see that there are no scheduled commands, but if you run it in 09:10 you will see your command running.
In this way you can just schedule your command to run every 5 min just for debugging purposes:
$schedule->command('command:daily-reset')->everyFiveMinutes();
then observe if there is any error while running and eventually fix it. By me the problem was that I haven't installed GuzzleHttp (shame), so the fix was just running this in the terminal:
composer require guzzlehttp/guzzle
I realized that the problem for me was the below chained method:
->withoutOverlapping()
Once I removed that method, my commands started running and being found by the daemon process.
I think there might be a bug with the method, but my project for now can take a bit overlapping so it's cool.
Did you try running command manually?
Run php artisan and see if your commands have registered.
If you have registered your commands you should see command:daily-reset and command:monthly-reset under the list of available artisan commands.
If you don't see them there go ahead and register your commands by adding it to commands property available in app/Console/Kernel.php.
protected $commands = [
'App\Console\Commands\YourFirstCommand',
'App\Console\Commands\YourSecondCommand'
];
Change crontab entry to
* * * * * php /home/privates/public_html/staging/current/artisan schedule:run
The Laravel scheduled commands are based in the timezone that you have configured in your app/config/app.php file (laravel 5.1):
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'America/Bogota',
So if you create a command and register it to run as a scheduled task with:
$schedule->command('command:daily-reset')->daily();
it will run every day at 00:00 OF THE TIMEZONE SPECIFIED (in this case America/Bogota)
The same thing applies if you specify a time to run the task:
$schedule->command('command:daily-reset')->daily()->at('02:30');
This will run at 02:30 am in America/Bogota local time.
NB: This is not answer for this question, but a clue for anyone debugging with php artisan schedule:run manually. Hope it saves someone a few minutes of headache.
Check if the scheduled task can run immediately. You can use the exec method for that.
<?php
//...
protected function schedule (Schedule $schedule) {
$schedule->exec("php artisan your:command");
}
The reason for this is that, you might be scheduling the task to run at a certain time and if that time isn't due yet, it will output:
No scheduled commands are ready to run.
The full answer to this question is not listed above as far as I can see. Let's assume that our schedule is as follows:
protected function schedule(Schedule $schedule)
{
$schedule
-> command('cbh:dummyCommand')
-> everyFiveMinutes()
-> appendOutputTo ('/my/logs/laravel_output.log');
}
What I've discovered is that this code doesn't set your job to run every 5 minutes. Nor does it prevent the command running again if it was run less than 5-minutes ago.
A better way to think about it is that this code sets the named command "to be runnable every time the minute-figure of the current time is 0 or 5". In other words, if I run the command-line argument: php artisan schedule:run at 11:04, then the response is:
# No scheduled commands are ready to run.
But if I run the same command at 11:00 or 11:05, then we get:
# Running scheduled command: php artisan cbh:dummyCommand >> /my/logs/laravel_output.log 2>&1
And I end up with output in my log-file.
I discovered the above when my everyFiveMinutes() schedule was creating a log in my file every 10 minutes based on the fact that my task-scheduler was running every 2 minutes.
However, this doesn't quite address your issue, given that the daily() schedule (0 0 * * *) aligns with your cron-job schedule. The only thing I can imagine is that there is some kind of misalignment with your time-zones as suggested by #Octavio Herrera. But that's difficult to say without knowing a bit more about your environment.
I had the same problem. Every command was correctly registered but I always received the “No scheduled commands are ready to run.” message. The problem was that the website was in "maintenance mode" (php artisan down command) while we were doing updates and tests.
I think that my blog will help you answer your question. Please see the below or link: Laravel Crontab
In many projects, you need use crontab (cron jobs) to execute some tasks as sending email or delete waste record in DB. With Laravel Project, you can do this easier.
Create a command in Laravel 4:
<?php
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class FirstCommand extends Command {
/**
* The console command name.
*
* #var string
*/
protected $name = 'user:active';
/**
* The console command description.
*
* #var string
*/
protected $description = 'Command description.';
/**
* Create a new command instance.
*
* #return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* #return mixed
*/
public function fire()
{
echo "User Actived";
}
/**
* Get the console command arguments.
*
* #return array
*/
protected function getArguments()
{
return array(
);
}
/**
* Get the console command options.
*
* #return array
*/
protected function getOptions()
{
return array(
array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
);
}
}
Next step, you need to register the command with Laravel CLI. So easy, you open app/start/artisan.php file, and add one line as below:
Artisan::add(new FirstCommand);
You are done creating Laravel Command. To test, you could use command below:
$ php artisan user:active
User Active
The output above mean you successfully register a command.
Finally, put your command into the crontab:
crontab -e
Add line (run command every 2 minutes):
*/2 * * * * php path_to_laravel_project/artisan user:active
That’s all. Thank you for talking time to read this.
On Windows, I fixed this issue by setting the Scheduled Task to run every minute (even though I only wanted to trigger a command once per day), otherwise I always got the No scheduled commands are ready to run. message.
Since I still ran into this issue 4 years later (2019) and a different workaround worked for me, I think it is worth hinting the simple step that solved for me, which is: Use a shorter interval first.
That seems to just wake it up to handle longer intervals in some ways. I had everyFiveMinutes() and for almost 2 hours it was getting the No scheduled commands are ready to run response. I simply changed it to everyMinute() and it started running correctly. I watched it consistently for like 10 minutes or so, then changed it back to everyFiveMinutes() and it all went smoothly.
I've stuck with this problem No scheduled commands are ready to run. for an hours, but solve it easly:
Problem was with rights to folder storage.
So, i've set chmod -R 777 storage/* (i'm not sure is this is elegant way).
After that cron starts working properly.
To run the Cron Commands on the local server, follow these steps:
I know you have already mentioned the command in app/console/Kernel.php
Now open the command line, enter "crontab -e"
Edit that file and mention the below code(without quote) to keep running PHP artisan schedule:run in the background
"* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1"
Enter "crontab -l" in the command line, it will list running crons
Done !!
Now, wait for cron to process your command. Cheers!!
Reference- https://laravel.com/docs/7.x/scheduling#introduction
For whatever reason cron does not recognize the named version of your task.
So in your schedule instead of writing
$schedule->command('command:task');
you should use the path of the class, such as
$schedule->command(\App\Console\Commands\TASK::class)
...the same goes for the scheduler on Laravel Forge!
I have tried everything but finally I found a solution for this problem. Add the timestamp in the command. Below is the example for this.
$schedule->call(function(){
print("HELLO");
})->dailyAt('21:51')->timezone('Asia/Kolkata');
or
$schedule->command('tenam:before')
->dailyAt('22:28')->timezone('Asia/Kolkata');
Try
php artisan cache:clear
and then run scheduler again with
php artisan schedule:run
I was also facing same issue and it resolved my problem.

Laravel cronjob not running on the server

I wanted to ask how automation of tasks aka cronjobs on a website are run using laravel commands?
I created a command following the tutsplus tutorial and call my functions in the fire method below:
public function fire()
{
$feeds= new FeedsController;
$update='update';
$feeds->getUpdateYoutube($update);
$feeds->getUpdateInstagram($update);
$feeds->getUpdateTwitter($update);
$feeds->getUpdateFacebook($update);
$feeds->getWriteToFile();
$this->info('Success');
}
However, this does not get called at all, despite the fact I included it called it on the server like so: 0 */2 * * * php /home/path/public_html/website artisan feeds-refresh
any clues what I am doing wrong?

How to run a cron job in codeigniter without using wget?

I want to run a cron job without using wget in CodeIgniter.
I am using it like this:
*/1 * * * * wget http://assurance.com/controller/function
It works successfully, but I do not want to use wget.
Is there any another way to run this CodeIgniter script?
You can try and use something like this:
* * * * * /usr/bin/php /pathToTheApp/controller/function
But of course the /usr/bin/php should be your path to the PHP binaries and pathToTheApp should be the absolute path to your CI application.
If you have local shell access on the host, add it to your crontab there.
I needed to do this exact thing recently and couldn't find a complete solution. So I'll try to provide one here.
I used "bash shell" because I wanted to make a command line (CLI) call to my controller into of an http (note: I'm using an ubuntu/linux server.
There are three main parts:
The cron call
The shell script
The controller function
Cron:
in your server cli type this to access crontab: crontab -e
then add your cron call: * * * * * bash /path/to/script/test.sh
(note: I created a folder in my site root called cron, so my path would be:
/var/www/website/cron/test.sh
Shell script:
In that cron folder we made, create a file called " test.sh "
In the file put:
#!/bin/bash
cd /path/to/site
/usr/bin/php index.php controller function
That's it
cron sets up the timer to call the file
shell calls the controller from the CLI
you'll now be able to use $this->input->is_cli_request() in your function for added security.
public function cronTest()
{
if($this->input->is_cli_request())
{
//code goes here;
}
}
Hope this helps save you some time, this took me way longer than expected :)

Categories