在Laravel中没有Task Scheduler的情况下如何进行CRON设置?

时间:2019-03-03 22:01:46

标签: php laravel cron

使用时出现问题

  

php artisan日程:运行

该命令返回

  

没有计划的命令可以运行。

我的服务器允许每5分钟拨打一次CRON。 所以我认为我的服务器设置是不按期运行的原因:运行。 因此,我需要尝试不使用Task Scheduler的CRON,并检查CRON是否返回正确的响应。

所以,请告诉我如何在没有Task Scheduler的情况下使用CRON。 作为信息,我将代码放在下面。 这些代码在我使用时可以正常发送电子邮件并进行记录

  

php artisan命令:notice_expired_date

Kernel.php     

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        '\App\Console\Commands\NoticeExpiredDateCommand',
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('command:notice_expired_date')
            ->daily()
            ->at(config('const.OPEN_TIME.FROM'))
            ->appendOutputTo(storage_path('logs/schedule/notice_expired_date.log'));        
    }

    protected function commands()
    {
        $this->load(__DIR__ . '/Commands');

        require base_path('routes/console.php');
    }    
}

ExpiredDateNotification.php     

namespace App\Console\Commands;

use App\Ticket;
use App\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use App\Notifications\ExpiredDateNotification;


class NoticeExpiredDateCommand extends Command
{
      protected $signature = 'command:notice_expired_date';

      protected $description = 'send email to user to notice the expired date of his tickets.';

      public function __construct()
        {
          parent::__construct();
        }

      public function handle()
        {
            $this->checkBefore1Week();
            Common::makeLog($this->getName());
        }

    protected function checkBefore1Week()
    {
        $from = Carbon::today()->copy()->addDays(7)->format('Y-m-d H:i:s'); //ex. 2019-03-01 00:00:00
        $to = Carbon::tomorrow()->copy()->addDays(7)->subSecond()->format('Y-m-d H:i:s');

        $tickets = Ticket::whereBetween('expired_date', [$from, $to])->get();
        $noticing_users = [];
        foreach ($tickets as $i => $ticket) {
            $noticing_users[$i] = $ticket['user_id'];
        }

        if ($noticing_users != []):
            $users = User::find($noticing_users);
            foreach ($users as $user) :
                $user->notify(new ExpiredDateNotification($user, $expired_date = $from));
            endforeach;
        endif;
    }
}

Common.php     

namespace App\Console\Commands;

class Common
{
    public static function makeLog($command_name)
    {
        $param = [
            'command_name' => $command_name,
        ];
        \Log::info('command executed', $param);
    }
}

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。 我是这样写cron的,但是没用。

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

现在,我像这样编写cron,并且可以正常工作。

*/5 * * * * cd /{project directory} && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1

php目录可能取决于服务器。

关于我在终端上键入以下内容。

php artisan schedule:run

时间的分钟数是5 该命令返回

  

运行计划的命令

如果时间的分钟位置不是5,则返回

  

没有计划的命令可以运行。