我有一个Laravel 5.4应用程序,它位于共享主机上,而cron作业不起作用。我已经在kernel.php中设置了命令,如下所示:
$schedule->command('eoddsmaker:get_events')
->withoutOverlapping()
->appendOutputTo(storage_path('logs').'/cron-get_events.log')
->everyMinute();
如果我只是从命令行运行/usr/bin/php-5.6 artisan eoddsmaker:get_events
它运行正常。当它被cron作业调用时虽然它没有运行。这是我的cron定义:
* * * * * /usr/bin/php-5.6 /var/sites/c/cyo.mydomain.com/artisan schedule:run >> /var/sites/c/cyo.mydomain.com/cron.log 2>&1
我可以从服务器上的cron日志中看到此任务每分钟运行一次,并且每次运行时,以下输出都会添加到cron.log文件中:
Running scheduled command: '/usr/bin/php' 'artisan' eoddsmaker:get_events > '/dev/null' 2>&1
X-Powered-By: PHP/5.6.8
Content-type: text/html; charset=UTF-8
因此,如果我查看cron-get_events.log文件,我已经配置了每次运行时将输出发送到以下的输出,那么要深入挖掘一下:
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /var/sites/c/cyo.mydomain.com/artisan on line 31
Parse error: syntax error, unexpected T_STRING in /var/sites/c/cyo.mydomain.com/artisan on line 31
因为我在共享主机上,默认的PHP版本是5.2,我必须在htaccess文件中添加一条规则才能使用PHP 5.6。如果我忘记添加规则,我会得到与cron-get_events.log中相同的错误,因此这让我相信命令不起作用的原因是因为当调度程序运行时它正在调用命令/usr/bin/php
作为PHP的路径,而不是/usr/bin/php-5.6
有没有办法将任务调度程序配置为使用不同的PHP路径?
答案 0 :(得分:0)
我设法通过更改我的调度程序任务定义来解决问题:
$schedule->command('eoddsmaker:get_events')
->withoutOverlapping()
->appendOutputTo(storage_path('logs').'/cron-get_events.log')
->everyMinute();
要:
$schedule->exec('/usr/bin/php-5.6 /var/sites/c/cyo.mydomain.com/artisan eoddsmaker:get_events >> /var/sites/c/cyo.mydomain.com/cron.log 2>&1')
->withoutOverlapping()
->appendOutputTo(storage_path('logs').'/cron-get_events.log')
->everyMinute();
我仍然有兴趣知道是否有更好的方法来实现这一点,以便我可以在Laravel中声明PHP的路径