I'm creating a custom command which will truncate a table every thirty minutes in the console kernel (for development purposes). I want to run another right after the previous command.
P.S: I have an if statement which prevents running these commands on the production server.
$schedule->command('db:seed')->after(function () use ($schedule) : void {
$schedule->command('my-command:remove-users-from-tables')
->everyThirtyMinutes()
->environments(['demo', 'local']);
});
I expect to run the seeder right after "my-command" runs successfully every thirty minutes. However, in this way, only db:seed runs.
If you want to run B after A you need to schedule A and AFTER that run B:
$schedule->command('my-command:remove-users-from-tables')
->everyThirtyMinutes()
->after(function() {
$this->artisan->call('db:seed');
});
I have checked the source code for Illuminate\Console\Scheduling\Schedule class.
I think when we say:
$schedule->command(...);
The artisan command will be scheduled, not run straightaway.
So when you write like this:
$schedule->command('first-command')->after(function () use ($schedule) {
$schedule->command('second-command');
});
The second command will be registered, not run right after the first command.
So the best approach that I can think of is run the second command inside the first command according to this link
You might try something like this:
namespace App\Console\Commands;
use Illuminate\Console\Command;
class RemoveUsersFromTable extends Command
{
public function handle()
{
// Do something to remove users from table.
$this->call('db:seed');
}
}
An alternative that may be relevant in some cases (but I can imagine would also be a bad idea in others) is to run shell_exec: https://www.php.net/manual/en/function.shell-exec.php
If you want to chain two artisan commands together as you would on the cli using && you can simply shell_exec('php artisan command:first && php artisan command:second').
shell_exec returns the console output so if your commands print anything (ie, via $this->info) then you can print that to console like so: $this->info(shell_exec('php artisan command:first && php artisan command:second'))
I'm probably going to get a lot of hate for this answer...
Related
How can i run these artisan commands in my application that is hosted in the net? Is there like a cmd in my cpanel where i can do these commands? Thanks in advance.
php artisan clear:cache
php artisan view:clear
Now in Laravel 5.8, you cannot pass object to call() func. You must pass an array [] as second argument to call() func.
Route::get('/clear-cache', function() {
$output = [];
\Artisan::call('cache:clear', $output);
dd($output);
});
Try this. You can clear all of laravel application cache hosted in shared hosting server that can not access ssh shell by the following code:
Route::get('/cleareverything', function () {
$clearcache = Artisan::call('cache:clear');
echo "Cache cleared<br>";
$clearview = Artisan::call('view:clear');
echo "View cleared<br>";
$clearconfig = Artisan::call('config:cache');
echo "Config cleared<br>";
$cleardebugbar = Artisan::call('debugbar:clear');
echo "Debug Bar cleared<br>";
});
Now run yourdoamin.com/cleareverything
This code does not throw any error. I already used this code.
Ref : https://laravel.com/docs/5.2/artisan#calling-commands-via-code
You can make a personalized route, and call it when you need it:
Route::get('/clear-cache', function() {
$output = new \Symfony\Component\Console\Output\BufferedOutput;
\Artisan::call('cache:clear', $output);
dd($output->fetch());
});
Another solution is to access ssh to your server and to run the commands.
You could create a simple bash script called clear-cache.sh like this:
#!/bin/sh
PHP=/path/to/your/php-binary
PATH=/path/to/your-artisan-install
cd $PATH
$PHP artisan clear:cache
$PHP artisan view:clear
Save the script and make it executable (chmod +x clear-cache.sh). Run it through a cronjob at specific intervals and configure the cron job to email you the output of those 2 commands. This way you'll get an email, every time the cron runs the script (basically the cron will automatically issue your two commands) and the ouput will be emailed to you.
Of course there are other methods as well like creating a php script and invoke it via web
I am wondering if there's any way to run an ad-hoc command in laravel? like in tinker, but without tinker?
I want to be able to run an ad-hoc command but without using tinker ?
Example:
"App\Post::orderBy('timestamp', 'desc')->first()"
I want to run this every 5 seconds?
Yes you can write orn comands in artisan. It is very useful.
Classes are kept in app/console
More: https://laravel.com/docs/5.5/artisan
I know there is Laravel 5.* now but for many reasons I'm using Laravel 4.2
I have a custom command, and in the fire() method, I import a file and seed the information in my database, so my class is some like this
class SeedDataFile extends Command {
protected $name = 'import:file';
public function fire(){
$command = 'mongoimport --db things --collection users --type csv --file file.csv --headerline';
$result = exec($command, $output, $return);
}
}
I want the file that is seeding data, i.e. every 12 hours (considering the file every 12 hours is changing with new data), but as an user I don't want to type the command in my terminal:
php artisan import:file
..every 12 hours (I just want to upload the new file to my project).
So the cron job is where I do all the work, but I don't want to do this:
crontab -e
and edit the file
I want to setup the schedule of my command in one class o somewhere in the code, and automatically the custom command is running everyday until a determined date.
Is this possible? Or I have to configure the crontab file?
You could take a look at this package, description says that it does exactly what you want
https://github.com/Indatus/dispatcher
As is Laravel 4.2 does not offer this type of functionality. In fact you'll need to set up 1 cron job for this functionality no matter the version you're using.
Newer versions of Laravel do indeed provide this functionality, but they still require you to set up 1 cron job (scheduler on Windows) at highest frequency available for Laravel's command php artisan schedule:run.
If you want to have scheduling of your commands in your code (rather than cron file) you could replicate what newer versions of Laravel do.
1. you would create a "master" command, let's call it TaskSchedulerCommand and let's say it's signature is php artisan schedule.
2. you would create a cronjob at highest frequency on the TaskSchedulerCommand like this: * * * * * php /path/to/artisan schedule`
3. you would write all the scheduling logic of other commands within the TaskSchedulerCommmand
I am using xampp with my local window system.
now a day I am working with codeigniter, I am trying to run a mycontroller function as a background job. Like
class Admin extends MX_Controller{
function __construct(){
parent::__construct();
}
function index(){
echo "working";
$command = "D:\xampp\php\php D:\xampp\htdocs\client\newslatter\index.php admin preget";
echo $out = exec( $command);
echo "here";
}
function preget(){
echo "<br/>Done!!!!!!";
}
}
I am not able to run a function using exec command can any one help out my problem?.
CodeIgniter has a page in it´s manual that is exactly about this:
http://ellislab.com/codeigniter/user-guide/general/cli.html
Note that, in your command, you just put the path to the file, you didn´t add "php"
$command = "php D:\xampp\php\php D:\xampp\htdocs\client\newslatter\index.php admin preget";
Maybe this solve your problem.
Is php.exe in the "Path" enviroment variable of your windows?
The process should be pretty easy: you run > "cmd" in Windows and navigate to your CodeIgniter project.
$ cd /path/to/project;
$ php index.php YourController ControllerMethod
I see you're using windows. To do this in Windows, I believe 'exec()' works by just calling like how you do on your command prompt using the "php" command, assuming that you have "php" installed as your environment variable.
So your $command would be
$command = "php D:\xampp\php\php D:\xampp\htdocs\client\newslatter\index.php admin preget";
However, FYI, this is a synchronous call.
If you want to do an async one (which a lot of times you would want), it doesn't work this way.
I did some research previously as I had this problem. This is probably what you're looking for when you wanna run exec on Windows with async.
$WshShell = new COM('WScript.Shell');
$oExec = $WshShell->Run('php D:\xampp\php\php D:\xampp\htdocs\client\newslatter\index.php admin preget', 0, false);
Hopefully that helps?
Thomas
I have setup CasperJS without a problem and have a script correctly configured & working when I execute directly via the command line - I would now like to have my PHP Codeigniter application 'talk-to' this script and be able to execute the same script via my web application. I am running XAMPP - although the final product will be deployed on a LAMP server.
To run the script (successfuly via the cmd I use the following:)
casperjs test.js
I have created a basic controller within Codeigniter with the following line but nothing seems to happen? Can anyone suggest what I am doing wrong?
public function run()
{
shell_exec('casperjs test.js');
}
The way I only allow a controller to be run by the command line is to check if it is a command line request. I validate this in the controller file.
if (!$this->input->is_cli_request()){
//redirect them to the homepage
redirect('', 'refresh');
}else{ //Request is coming from the command line }
To run a controller from a command line on a linux server use a command like this:
/usr/bin/php /var/www/website/index.php controller_name function_name
See this link for more information: http://ellislab.com/codeigniter/user-guide/general/cli.html