curl调用后没有保存PHP会话

时间:2014-08-19 17:05:55

标签: 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);

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

echo json_encode(array(
            'success' => true,
            'ALLSESSION' => $_SESSION,
            'error'=> ""
        )); 

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

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

由于

1 个答案:

答案 0 :(得分:6)

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

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

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

  1. 在cUrl
  2. 中启用Cookie支持
  3. 将会话ID作为网址参数
  4. 传递
  5. 将会话ID作为请求变量(post / cookie)或不使用PHP预期名称的URL参数传递,然后使用该会话ID在服务器端手动启动会话。
  6. 解决方案#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);
    

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

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

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

    “PHPSESSID”是PHP中默认使用的变量名称。如果服务器是setup to use a non-default name,那么您需要使用该变量名称。

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

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

    不建议在正常情况下使用此解决方案。与以前的解决方案不同,此解决方案需要更改服务器端脚本以及客户端(cUrl)。此解决方案仅在您特别希望将会话ID发送为URL参数或cookie之外的其他内容时,或者如果您要使用服务器所期望的名称以外的变量名称时才有用。 放置following code in your server-side PHP that is handling the request, prior to starting the sessionsession_id($_POST[<param_name>]);session_id($_GET[<param_name>]);session_id($_COOKIE[<param_name>]);


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


    此外,PHP不关心请求是GET还是POST或任何其他HTTP请求方法。无论HTTP请求方法如何,如果会话ID为passed as a URL parameter or in a cookie,则相关会话将在服务器端持续存在。