PHP项目,response头有返回setCookie,但是为什么服务器端没有创建对应的seesion?

新手上路,请多包涵

我用GUZZLE创建httpclient模拟请求自己的phpweb项目,确认web项目是有session_start()的,模拟登陆请求成功后,response-header里有Set-Cookie,当我用set-cookie里的PHPSESSID去请求下一个页面时,seesion不可用,到服务端查看session_save_path里确实没有对应的session。

我用浏览器访问登陆后拿到cookie,再写到代码里就可以通过,说明请求代码没问题。而且浏览器拿到的cookie在服务端的session_save_path里是有对应的session的。

相关代码

$client = new Client([
            'base_uri' => 'http://my.domain.com',

        ]);
        $response = $client->request('POST','/?action=sys&opt=login',[
            'action'=>'login',
            'uName'=>'myUName',
            'uPass'=>'myPwd',
        ]);
        print_r($response->getHeader('Set-Cookie'));//此处打印正常Array([0] => PHPSESSID=22fosfolsvoqardv5atdg0cnr2; expires=Sat, 19-Jan-2019 03:45:38 GMT; path=/; domain=my.domain.com)
        $cookie = substr((explode(';',($response->getHeader('Set-Cookie'))[0]))[0],10);


        $jar = CookieJar::fromArray(['PHPSESSID'=>$cookie],'my.domain.com');
        $response = $client->request('GET', '/?action=game&opt=gameindex&type=add',[
            'cookies'=>$jar
        ]);

可以确认服务端的session保存路径里没有response-header返回cookie里对应的session,也没有另外设置过session名,通过浏览器拿到的cookie是可以用的。求各位大神指出错误,感谢。

阅读 2.1k
1 个回答
✓ 已被采纳新手上路,请多包涵

还是自问自答,好像sf里phper非常少,
我这里的通过xdebug的远程调试发现,我web代码里有一个Session['uName']判断,当他为空时会destory_session()删除服务器的session文件。
我这里是有一个写法错误

$response = $client->request('POST','/?action=sys&opt=login',[
            'action'=>'login',
            'uName'=>'myUName',
            'uPass'=>'myPwd',
        ]);

这里应该修改为

$response = $client->request('POST','/?action=sys&opt=login',[
            'form_params' => [
                'action'=>'login',
                'uName'=>'myUName',
                'uPass'=>'myPwd',
                ]
        ]);

post的参数才会被正确发送。Well done!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题