2017-03-24 14 views
1

定期的に実行するのではなく、特定のタイムスタンプで関数を1回だけ実行するにはどうすればよいですか?Laravelのタスクスケジューラを所定のタイムスタンプで1回だけ実行するように設定するにはどうすればよいですか?

私のアプリケーションは次のとおりです。 id(主キー)と時刻(整数として保存されたエポックタイムスタンプ)の2つのテーブルがあります。さて、各エントリについて、私はテーブルに格納されたタイムスタンプで実行される関数を呼び出したいと思います。これをどのように達成するのですか?

タスクスケジューラの代替手段はありますか? 私はLaravel 5.4(重要な場合)を使用しています

編集:私は回避策を知っていますが、私は最も効率的な解決策を探しています。

答えて

0

コンセプトは毎分スケジューラを実行し、その期間のレコードを選択することです&関数を実行します。私は以下のコードを書きました。秒が重要な場合は、毎秒スケジューラの実行方法を確認する必要がありますが、コンセプトは同じです。

希望これはあなたが

use Carbon\Carbon; 
... 
$schedule->call(function() { 

    // Look in your table for `time` in current minute, between 0-59s 
    $entries = TheTable::where([ 
     ['time', '>=', Carbon::now()->second(0)->timestamp], 
     ['time', '<=', Carbon::now()->second(59)->timestamp] 
    ]); 

    // Loop through the results & call the function 

})->everyMinute(); 
+0

はい、これは私の問題を解決しないのに役立ちます。実際には、これが私の心に来た最初のものでした。しかし、それはむしろ非効率です。毎分タスクが完了しても毎分データベースクエリが呼び出されますが、タスクは実行され続けます。もっと良い選択肢はありませんか?もしそうでなければ、私はこのトリックをする必要があります。 –

+0

なぜレスポンスをキャッシュしないのですか?そうすれば、データベースに一度アクセスするだけで済みます。再度実行する必要がある場合は、キャッシュのタイムアウトを設定するか、適切なイベントに基づいてクリアすることができます。 –