Laravel 4.2 にIndatus/dispatcherを使用しています。これは基本的に Cron ジョブ ベースのタスク スケジューラです。
Cron ジョブを毎分実行しようとしていますが、ライブ サーバーでこのエラーが発生しています (ただし、ローカル マシンでは問題なく動作します)。これが私がやったことです:
<?php
use Indatus\Dispatcher\Scheduling\ScheduledCommand;
use Indatus\Dispatcher\Scheduling\Schedulable;
use Indatus\Dispatcher\Drivers\Cron\Scheduler;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class TestCommand extends ScheduledCommand {
/**
* The console command name.
*
* @var string
*/
protected $name = 'command:check';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Check if the meberships are verified.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* When a command should run
*
* @param Scheduler $scheduler
* @return \Indatus\Dispatcher\Scheduling\Schedulable
*/
public function schedule(Schedulable $scheduler)
{
return $scheduler->everyMinutes(1);
}
/**
* Execute the console command.
*
* @return mixed
*/
public function fire()
{
Log::info('I was here @ ' . date('H:i:s'));
}
/**
* Get the console command arguments.
*
* @return array
*/
protected function getArguments()
{
return array(
// array('example', InputArgument::REQUIRED, 'An example argument.'),
);
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return array(
// array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
);
}
}
つまり、基本的には、スケジューラが実行されるたびに、ログ ファイル (つまりStorage/laravel.log ) に 1 行を書き込むだけです。ローカル マシンで実行php artisan scheduled:run
すると、ログ ファイルに新しい行が書き込まれます。
これで、サーバーにコードをアップロードし、Cron ジョブを次のように作成しました。
Cron ジョブは予想どおり毎分実行され、ログ ファイルも毎分更新されますが、ログ ファイルに書き込んでいるメッセージの代わりに、次のエラーが毎分書き込まれます。
[2016-09-24 09:20:01] production.ERROR: 例外 'InvalidArgumentException' とメッセージ 'コマンド "command:check" が定義されていません。
これのことですか?
/home/mhjamil/public_html/l4-cron/test/vendor/symfony/console/Symfony/Component/Console/Application.php:564 のコマンド:make'
Stack trace: #0 /home/mhjamil/public_html/l4-cron/test/vendor/symfony/console/Symfony/Component/Console/Application.php(190): Symfony\Component\Console\Application->find('command:check') #1 /home/mhjamil/public_html/l4-cron/test/vendor/symfony/console/Symfony/Component/Console/Application.php(124): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #2 /home/mhjamil/public_html/l4-cron/test/artisan(58): Symfony\Component\Console\Application->run() #3 {main} [] []`
ちなみに、コマンドはapp/start/artisan.phpに次のように登録しました。
Artisan::add(new TestCommand);
また、コマンドphp artisan command:check
はローカル マシンで正常に実行されますが、サーバーにアップロードするとCommand "command:check" is not defined と表示されます。
もう1つ、サーバーにルートを追加して実行しましたArtican::call("command:check");
。このページをリロードするたびに、ログ ファイルにエントリが正常に記録されます。しかし、cronジョブを介して実行するとエラーが発生します。したがって、問題はcronジョブまたはサーバー設定に多少関連していると推測しています。
cron コマンドを次のように変更しようとしました。
/usr/bin/php /home/mhjamil/public_html/l4-cron/test/artisan command:check 1>> /dev/null 2>&1
以前は使用してschaduled:run
いましたが、まだ同じ問題です:(