次のLaravelコマンドを設定しました:
protected function schedule(Schedule $schedule) {
$schedule->command('command:daily-reset')->daily();
$schedule->command('command:monthly-reset')->monthly();
}
次に、サーバー上で、1日1回(00:00)に実行されるcronジョブをセットアップしました。
0 0 * * * php /home/privates/public_html/staging/current/artisan schedule:run
私のcronジョブは毎晩正常に実行されていますが、ログには「スケジュールされたコマンドを実行する準備ができていません」と表示されます。
私は何を間違えていますか? daily
コマンドが毎晩実行されると予想します。
ありがとう!
コマンドmanuallayを実行してみましたか?
php artisan
を実行し、コマンドが登録されているかどうかを確認します。
コマンドを登録している場合、利用可能な職人コマンドのリストの下にcommand:daily-reset
とcommand:monthly-reset
が表示されます。
表示されない場合は、app/Console/Kernel.php
で使用可能なcommands
プロパティに追加してコマンドを登録してください。
protected $commands = [
'App\Console\Commands\YourFirstCommand',
'App\Console\Commands\YourSecondCommand'
];
Crontabエントリを変更します
* * * * * php /home/privates/public_html/staging/current/artisan schedule:run
走るとき
php artisan schedule:run
プロジェクトが保存されているサーバーでは、次のように出力で実行されているすべてのコマンドを確認できます。
"Running scheduled command: '/usr/local/bin/php' 'artisan' cache:update > '/dev/null' 2>&1 &"
ただし、現在の時刻がコマンドがスケジュールされている正確な時刻である場合のみ。それ以外の場合、次の出力が表示されます。
"No scheduled commands are ready to run."
たとえば、5分ごとにコマンドをスケジュールし、09:07にコマンドを実行すると、スケジュールされたコマンドがないことがわかりますが、09:10にコマンドを実行すると、コマンドが実行されます。
このようにして、デバッグ目的でコマンドを5分ごとに実行するようにスケジュールできます。
$schedule->command('command:daily-reset')->everyFiveMinutes();
実行中にエラーがあるかどうかを観察し、最終的に修正します。私にとって問題は、GuzzleHttp(恥)をインストールしていないということでした。そのため、修正はターミナルでこれを実行するだけでした。
composer require guzzlehttp/guzzle
私にとっての問題は以下の連鎖方法であることに気付きました:
->withoutOverlapping()
そのメソッドを削除すると、コマンドが実行を開始し、デーモンプロセスによって検出されました。
このメソッドにはバグがあるかもしれないと思いますが、今のプロジェクトは少し重複する可能性があるのでクールです。
注意:これはこの質問に対する答えではありませんが、php artisan schedule:run
手動で。それが誰かの頭痛の種を救うことを願っています。
スケジュールされたタスクをすぐに実行できるかどうかを確認します。そのためにexec
メソッドを使用できます。
<?php
...
protected function schedule (Schedule $schedule) {
$schedule -> exec("php artisan your:command");
}
その理由は、特定の時間にタスクを実行するようにスケジュールしている可能性があり、その時間にまだ間に合わない場合は、「スケジュールされたコマンドを実行する準備ができていません」を出力するからです。
Laravelスケジュールされたコマンドは、app/config/app.phpファイル(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',
したがって、コマンドを作成し、それを登録して、スケジュールされたタスクとして実行する場合:
$schedule->command('command:daily-reset')->daily();
指定されたタイムゾーンの00:00に毎日実行されます(この場合はAmerica/Bogota)
タスクを実行する時間を指定する場合も同じことが当てはまります。
$schedule->command('command:daily-reset')->daily()->at('02:30');
これは、アメリカ/ボゴタ現地時間の午前2時30分に実行されます。
私が見る限り、この質問に対する完全な答えは上にリストされていません。私たちのスケジュールは次のとおりであると仮定しましょう:
_protected function schedule(Schedule $schedule)
{
$schedule
-> command('cbh:dummyCommand')
-> everyFiveMinutes()
-> appendOutputTo ('/my/logs/laravel_output.log');
}
_
私が発見したことは、このコードはあなたの仕事を5分ごとに実行するように設定しないことです。また、5分以内に実行されたコマンドが再度実行されるのを防ぎません。
それについて考えるより良い方法は、このコードが名前付きコマンドを設定することです"現在の時刻の分桁が_0
_または_5
_"になるたびに実行可能になります。言い換えると、コマンドライン引数を実行した場合、_php artisan schedule:run
_を_11:04
_で実行すると、応答は次のようになります。
_# No scheduled commands are ready to run.
_
ただし、_11:00
_または_11:05
_で同じコマンドを実行すると、次のようになります。
_# Running scheduled command: php artisan cbh:dummyCommand >> /my/logs/laravel_output.log 2>&1
_
そして、ログファイルに出力が表示されます。
タスクスケジューラが2分ごとに実行されているという事実に基づいて、everyFiveMinutes()
スケジュールが10分ごとにファイルにログを作成しているときに上記を発見しました。
ただし、daily()
スケジュール(_0 0 * * *
_)がcronジョブスケジュールと一致しているため、これは問題に対処しません。私が想像できる唯一のことは、@ Octavio Herreraが示唆しているように、タイムゾーンに何らかの不整合があるということです。しかし、あなたの環境についてもう少し知らずにそれを言うのは難しいです。
私のブログがあなたの質問に答えてくれると思います。以下を参照するか、リンクを参照してください: Laravel Crontab 多くのプロジェクトでは、crontab(cronジョブ)を使用して、電子メールの送信または廃棄レコードの削除などのタスクを実行する必要がありますDBで。 Laravel Projectを使用すると、これを簡単に行うことができます。
あなたが値するものを待つのに十分なほど忍耐強くなり、あなたが値するものを待つのに十分なほど忍耐強くなる
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),
);
}
}
次のステップでは、コマンドをLaravel CLIで登録する必要があります。簡単にapp/start/artisan.phpファイルを開き、次のように1行を追加します。
Artisan::add(new FirstCommand);
Laravelコマンドを作成しました。テストするには、以下のコマンドを使用できます。
$ php artisan user:active
ユーザーがアクティブ上記の出力は、コマンドが正常に登録されたことを意味します。
最後に、コマンドをcrontabに配置します。
crontab -e
行を追加(2分ごとにコマンドを実行):
*/2 * * * * php path_to_laravel_project/artisan user:active
それで全部です。これを読む時間を話してくれてありがとう。
Windowsでは、スケジュールされたタスクを実行するように設定することでこの問題を修正しました毎分(1日に1回だけコマンドをトリガーしたい場合でも)、そうでない場合は常にNo scheduled commands are ready to run.
メッセージ。
同じ問題がありました。すべてのコマンドは正しく登録されていましたでしたが、常に「実行する準備ができているスケジュール済みコマンドはありません。」メッセージを受け取りました。問題は、ウェブサイトが"メンテナンスモード"(php artisan downコマンドであったことでした。更新とテストを行っていました。