关于定义任务调度中注册而生成的app\Console\Commands下的类文件不能获取session的问题

我想做个定时任务,需要用到app\Console下的kernel.php来定义定时任务,我在schedule方法里面用的是

     protected $commands = [
          \App\Console\Commands\Inspire::class,
          \App\Console\Commands\ToOrder::class,    // 这是我注册的类
     ];

    protected function schedule(Schedule $schedule)
    {
         $schedule->command('inspire') ->hourly();
         $schedule->command('to_order')->everyMinute();
     }

然而在 \App\Console\Commands\ToOrder这个类中的handle方法中我无法获取我已设置好的session('uid')。为什么?请问怎么获取到session('uid')?

刚刚去查了一些资料,貌似命令行下好像真的不可以获取session,session 只跟 web 服务挂钩。

You dosen't have access to session in CLI. Session is strictly connected with the web browser (client side) which dosen't make sens in command line.

JellyBool

你是怎么设置你的 session('uid') 的?这种问题基本上就是没设置好session 或者在执行命令的时候,session 过期了。

希望发帖的时候,用 markdown 排版一下代码。这样好很多

markdown 教程:https://laravist.com/discuss/markdown/learn-to-use-markdown-21

zhouweiji

我没设置session,就是安装好后自动默认的session配置,我的是laravel5.1版本

JellyBool 回复 zhouweiji

我是说,你在哪里设置了 session('uid') 这个值?

zhouweiji 回复 JellyBool

在登录的控制器里面设置的

zhouweiji 回复 JellyBool

LoginController(这个是登录控制器)中的登录验证密码通过后就立即设置seesion('uid')

JellyBool 回复 zhouweiji

代码可以给看看么?你使用下面的方式看看有这个 session 值没有:

 return Session::all();

不要在使用 session 的时候 dd() dump() 或者 die

zhouweiji 回复 JellyBool

这个我试过了,我用日志记录的

public function handle()
    {
        //
        //$d = $request->session()->all();
        //Session::put('user','zhouweiji');
        /*$h = new HomeController($reuqest);
        Log::info(json_encode($h->to_order()));*/
        $s = new SettingModel();
        //$a = $s->get_appconfig();
        Log::info(json_encode($s->se()));
        /*$m = new Meituan($a->meituan_appid,$a->meituan_secret);
        Log::info(json_encode($m->get_stores_id()));*/
    }
JellyBool 回复 zhouweiji

你清一次缓存,然后handle中什么都不写:

public function handle()
    {

        \Log::info(session('uid'));
    }

就这样,试过么?有没有值记录到日志中?确定 return Session::all();有 uid 这 session 的话,理论上是都可以取到的

zhouweiji 回复 JellyBool

清了浏览器缓存,然后再登录页面登录,最后执行php artisan schedule:run还是获取为null

zhouweiji 回复 JellyBool

Session:get(‘uid’)
$request->session()->get(‘uid’);
这些方法还是获取不到,一获取就报session未设置的错误

zhouweiji 回复 JellyBool

我也奇怪,难道说web层面的和我这个任务调度不能共享session?我试了一下在handle方法里面直接设置session,然后获取就可以,可是这样没意义,我需要登陆后的session设置

JellyBool 回复 zhouweiji
难道说web层面的和我这个任务调度不能共享session?//不可以的,已打脸

恩,貌似是不可以的

zhouweiji 回复 JellyBool
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

use Log;
use App\libs\Meituan;
use App\SettingModel;
use Illuminate\Support\Facades\Session;
/*use Illuminate\Http\Request;
use App\Http\Controllers\HomeController;
use Illuminate\Http\Request;

use App\Http\Requests;*/

class ToOrder extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'to_order';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'order detail API';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
        Log::info(session('uid'));
    }
}

这是\App\Console\Commands\ToOrder这个类文件

zhouweiji 回复 JellyBool

我在控制器和其他model里面都可以获取到·session(‘uid’) ·的值,到了任务调度这些类文件里就不可以了

JellyBool 回复 zhouweiji

真的出现这个情况,就很诡异了,理论上是没有问题的。

zhouweiji 回复 JellyBool

我也奇怪,难道说web层面的和我这个任务调度不能共享session?我试了一下在handle方法里面直接设置session,然后获取就可以,可是这样没意义,我需要登陆后的session设置

zhouweiji 回复 JellyBool
/**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
        Log::info(session('uid'));
    }

还是不可以获取到,还是为null

JellyBool 回复 zhouweiji

刚刚去查了一些资料,貌似命令行下好像真的不可以获取session,session 只跟 web 服务挂钩。

You dosen’t have access to session in CLI. Session is strictly connected with the web browser (client side) which dosen’t make sens in command line.

zhouweiji 回复 JellyBool

那怎么办,我需要根据uid来获取用户相关数据的,求解…大大,牛逼,你在哪里查的,我怎么百度不了,百度很少资料

zhouweiji 回复 JellyBool

刚问了老大,不用session了,直接获取全部用户的相关数据来更新,实在太好了。感谢JellyBool大大花了那么多的时候耐心的帮我解答,同时让我学习了这里获取不到session的知识点,谢谢!!!

JellyBool 回复 zhouweiji

这应用场景,可以把需要的数据直接存数据库,这样持久化应该就不会有什么问题了。

zhouweiji 回复 JellyBool

我的需求是:每分钟请求美团商家的最新订单接口

JellyBool 回复 zhouweiji

那你放缓存吧。这样的话直接 redis 缓存就行。

zhouweiji 回复 JellyBool

嗯,用高速缓存不错。谢谢!

zhouweiji 回复 JellyBool

听了老大的分析,想想是不需要根据当前商家来获取最新订单。因为我是要每分钟获取全部最新订单,这样每个商家都会有最新订单了。

zhouweiji

可是我刚登陆就去用window的cmd执行一次php artisan schedule:run就获取session为null,不知道为什么会这样?

我的session配置如下:
`'driver' => env('SESSION_DRIVER', 'file'),`
`'lifetime' => 120,`
`'expire_on_close' => false,`
`'encrypt' => false,`
`'files' => storage_path('framework/sessions'),`
`'connection' => null,`
`'table' => 'sessions',`
`'lottery' => [2, 100],`
`'cookie' => 'laravel_session',`
`'path' => '/',`
`'domain' => null,`
`'secure' => false,`
zhouweiji

今天我又试了一下用其中一个model的方法来帮忙获取session('uid')
然后\App\Console\Commands\ToOrder类文件加载model文件,
最后cmd执行php artisan schedule:run,日志还是显示获取到NULL

zhouweiji
/**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
        $s = new SettingModel(); //这是model,se()方法里面在帮忙获取session
        Log::info(json_encode($s->se())); //可是日志记录为null

        //$d = $request->session()->all();
        //Session::put('user','zhouweiji');
        /*$h = new HomeController($reuqest);
        Log::info(json_encode($h->to_order()));*/
        //$a = $s->get_appconfig();
        /*$m = new Meituan($a->meituan_appid,$a->meituan_secret);
        Log::info(json_encode($m->get_stores_id()));*/
    }