php - 跨curl请求维护会话

时间:2017-11-16 12:44:29

标签: php session curl

我已经能够使用以下代码在我的curl请求创建的过程中使用我当前的会话 -

$query = http_build_query(array(
   "pcode"=>strtolower($code)
));
$url = $_SERVER['REQUEST_SCHEME'].":".PUBLIC_ROOT."xyz.php"."?".$query;

session_write_close();

$curl = curl_init($url);
$useragent = $_SERVER['HTTP_USER_AGENT'];
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_GET, true);
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_COOKIE, $strCookie );

$json_response = curl_exec($curl);
curl_close($curl);

我对以上代码使用了以下答案 - https://stackoverflow.com/a/15374966/815929

现在问题是在新进程(由curl请求创建)中,我需要设置一些会话变量。但是,这些会话变量不会在curl_close()之后的调用过程中反映出来。

我的调用脚本中有一些会话变量。我能够在curl请求启动的新进程中使用这些会话变量。这个新流程还设置了一些新的会话变量。但是,当我们回到调用进程时,这些新的会话变量不会被反映出来。

我需要设置额外的卷曲选项才能使其正常工作吗?

1 个答案:

答案 0 :(得分:1)

我很难想象它是如何运行的。

  

但是这些会话变量在curl_close()

之后的调用过程中没有反映出来

使用默认会话处理程序,第二个脚本如果从类似....

中调用它就应该超时
session_start();
...
curl_exec(); // at this point session file is still locked
...
[session_close();]
  

$ strCookie ='PHPSESSID ='。 $ _COOKIE ['PHPSESSID']。 “;路径= /';

是吗?您没有在HTTP请求中指定cookie的路径(您在响应中执行)。这将告诉脚本客户端有一个名为“path”的cookie。

真的应该是......

$ strCookie = session_name()。 “=”。 SESSION_ID();

  

但是这些会话变量在curl_close()

之后的调用过程中没有反映出来

您是否从存储重新加载会话? (另请参阅前面有关会话文件锁定的说明)。你的代码应该像......那样做。

session_start();
...
session_close();
...
curl_exec();
...
session_start();

切换到non-blocking handler会更干净,或者更好但不通过会话传递状态 - 将数据POST到第二个脚本读取输出流的响应。