Google App Engine上的Laravel任务计划

时间:2017-07-31 14:45:53

标签: php laravel google-app-engine cron artisan

有没有办法在App Engine上执行php artisan命令? 我需要设置Laravel的Task Scheduling,这需要设置以下cron作业:

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

但是当我查看cron.yaml文档时,没有执行php文件的方法,似乎只支持对URL的HTTP调用。

反正可以帮我解决这个问题吗?

更新1 请不要建议从控制器内拨打Artisan::handle($command)。我需要artisan

的PHP-CLI版本

2 个答案:

答案 0 :(得分:3)

我想没有任何建议,我已经通过在网络路线中写这个来做到这一点

Route::get('scheduler', ArtisanController@handle)->middleware('app-engine-cron');

这在ArtisanController

class ArtisanController extends Controller
{
    public function handle()
    {
        shell_exec('php '.base_path('artisan').' schedule:run > /dev/null 2>/dev/null &');
    }
}

和这个中间件

class AppEngineCronMiddleware
{

    public function handle($request, Closure $next)
    {
        if (!$request->hasHeader('X-Appengine-Cron')) {
            return response()->json(trans('auth.unauthorized'), 401);
        }

        return $next($request);
    }
}

最后cron.yaml就像这样

cron:
- description: "Laravel Scheduler"
  url: /scheduler
  schedule: every 1 mins
  target: default

任何有这个问题的人都可以试试这个,它对我有用。无论如何其他建议非常受欢迎。特别是来自谷歌

答案 1 :(得分:1)

对在此线程后的每个人执行ping操作的道歉,但以为我会提供另一种解决方案。这可能更像是一个讨论点,而且很容易听到您对此的看法

Artisan提供了一个schedule:work命令:(强调我的)

通常,您不会将调度程序cron条目添加到本地开发计算机。相反,您可以使用schedule:work Artisan命令。 此命令将在前台运行,并每分钟调用一次调度程序,直到您终止该命令为止

我们目前正在将GAE用于Laravel项目,并已成功Google App Engine docs中所述覆盖了Supervisiord配置。也就是说,在supervisord_conf_override的{​​{1}}下指定runtime_config键,该键在源代码中引用了库存标准的监督配置文件。

所以。您可以提供一个监督配置,以便它监视app.yaml命令。例如:

php artisan schedule:work

当然,这样做的好处是不需要走到[supervisord] nodaemon = true logfile = /dev/null logfile_maxbytes = 0 pidfile = /var/run/supervisord.pid [program:laravel-schedule-worker] command = php %(ENV_APP_DIR)s/artisan schedule:work stdout_logfile = /dev/stdout stdout_logfile_maxbytes=0 stderr_logfile = /dev/stderr stderr_logfile_maxbytes=0 user = www-data autostart = true autorestart = true priority = 5 stopwaitsecs = 20 [supervisorctl] ,但是据我了解,runtime_config键仅在GAE“灵活”环境中可用。因此,如果您处于“标准”环境中,那么当前接受的答案就是解决之道。

Laravel文档将shell_exec(...)命令描述为在本地环境中使用的命令,但是我不明白为什么不能在生产环境中使用此命令……也许我缺少了一些东西?