curl调用后没有保存PHP会话

Dig*_*ess 1 php session curl session-variables

我需要通过curl脚本验证我的用户

session_start();
$_POST["username"]= "user";
$_POST["password"]= "password";

$ch = curl_init();

$url = 'signin.php';


 curl_setopt($ch,CURLOPT_URL, $url);
 curl_setopt($ch,CURLOPT_POST, count($_POST));
 curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST);
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

 $result = json_decode(curl_exec($ch),true);
 curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

signin.php对api进行另一个curl调用,我确保signin.php返回所有必需的信息,设置所有必需的会话变量,返回一个数组:

echo json_encode(array(
            'success' => true,
            'ALLSESSION' => $_SESSION,
            'error'=> ""
        )); 
Run Code Online (Sandbox Code Playgroud)

ALLSESSION正在返回正确的会话变量,但它们不能直接访问,我的意思是我不能使用$ _SESSION ["userid"],它在会话数组中不存在.

如何保留2页之间的会话?

谢谢

Eva*_*ruz 6

问题是客户端没有记住/传输PHP会话ID.

当HTTP客户端向php脚本发出请求(通过HTTP服务器)时,如果希望继续之前启动的会话,则必须在请求中包含会话ID.这可以在HTTP标头中作为cookie或URL参数(默认情况下名为PHPSESSID)来完成.如果您不想使用PHP的默认会话变量名,或者如果您想使用POST变量而不是URL参数,那么您可以使用您希望的任何请求变量或URL参数(无论是GET,POST还是COOKIE) ),但是你需要在服务器端手动解释这个变量.

以下是三种解决方案,按照大多数建议最少推荐的顺序.

  1. 在cUrl 或中打开cookie支持
  2. 将会话ID作为URL参数传递
  3. 将会话ID作为请求变量(post/cookie)或不使用PHP预期名称的URL参数传递,然后使用该会话ID在服务器端手动启动会话.

解决方案#1:在cUrl中启用cookie支持

每次您从该客户端发出请求时,PHP都会使用cookie中的会话ID重新加载会话数据.

在这种情况下,客户端是cUrl.您需要设置cUrl请求以允许/使用cookie.这可以通过设置CURLOPT_COOKIEJARCURLOPT_COOKIEFILE选项来完成.

session_start();
$_POST["username"]= "user";
$_POST["password"]= "password";

$ch = curl_init();

$url = 'signin.php';

//Name of a file to store cookie data in.
//If the file does not exist, it will be created.  
//cUrl (or your web server) needs to have write permissions to the folder.
$cookieFile = "/some/writable/folder/filename";


curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($_POST));
curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

//Tell cUrl about the cookie file
curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile);  //tell cUrl where to write cookie data
curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile); //tell cUrl where to read cookie data from

$result = json_decode(curl_exec($ch),true);
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

对CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE 使用$ cookieFile的任何后续cUrl调用将具有与先前调用相同的会话数据.

解决方案#2:使用期望的参数名称在URL查询字符串中传递会话ID(默认情况下为PHPSESSID,但可以更改)

您可以将会话ID附加到所有网址,如下所示:somepage.php?PHPSESSID = sessionidgoeshere

"PHPSESSID"是PHP中默认使用的变量名称.如果服务器设置为使用非默认名称,则需要使用该变量名称.

使用解决方案#2,您仍然需要以某种方式在客户端存储会话ID.

解决方案#3:将会话ID作为请求变量或URL参数传递,然后使用该会话ID在服务器端手动启动会话.

建议不要在正常情况下使用此解决方案.与以前的解决方案不同,此解决方案需要更改服务器端脚本以及客户端(cUrl).此解决方案仅在您特别希望将会话ID发送为URL参数或cookie之外的其他内容时,或者如果您要使用服务器所期望的名称以外的变量名称时才有用.放置在你的服务器端PHP下面的代码是在启动会话处理请求,之前: session_id($_POST[<param_name>]);session_id($_GET[<param_name>]);session_id($_COOKIE[<param_name>]);


我建议使用解决方案#1,除非你有令人信服的理由不这样做.


此外,PHP不关心请求是GET还是POST或任何其他HTTP请求方法.无论HTTP请求方法如何,如果会话ID 作为URL参数或cookie传递,则相关会话将在服务器端保留.