有没有办法在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
答案 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(...)
命令描述为在本地环境中使用的命令,但是我不明白为什么不能在生产环境中使用此命令……也许我缺少了一些东西?