通过curl将会话信息传递给PHP

时间:2014-12-19 19:07:39

标签: php session curl cookies

我要做的是让客户端程序的会话可用于服务器程序。

两个程序都在同一个Apache站点上运行,因此会话文件,权限等的配置都是相同的。

测试服务器程序:

<?php
session_name('main');
session_start();
echo '<pre>'.print_r($_COOKIE, true).'</pre>';
?>

测试客户端程序:

<?php
session_name('main');
session_start();
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_COOKIE, 'main='.session_id());
curl_setopt($ch, CURLOPT_POSTFIELDS, 'A=1&B=2');
$result=curl_exec($ch);
curl_close($ch);
echo $result;
?>

行为:

  • 如上所述,对服务器的curl调用超时。
  • 如果我从服务器中删除session_start(),服务器将按预期返回cookie值。
  • 当我从客户端删除curl_setopt($ ch,CURLOPT_COOKIE,&#39; main =&#39; .session_id())时,每次调用服务器都会按预期创建一个新的会话文件。
  • 我添加了curl_setopt($ ch,CURLOPT_COOKIEFILE,$ cookiefile),确保$ cookiefile存在且可写,行为没有变化。

这是不可能做到的?我不需要写任何cookie或获取cookie信息,我只需要服务器程序就能够访问与客户端相同的会话信息。

1 个答案:

答案 0 :(得分:0)

经过多次搜索,我发现了原因。客户端脚本已锁定会话文件,因此服务器会话无法读取它,因此超时。更多信息:PHP Sessions - Locking and Sharing questions

因此在客户端中执行session_write_close()可以解决问题,并保留$ _SESSION变量,但是如果使用会话cookie并且输出已经发生(客户端),则会话无法在客户端上重新启动,因此此解决方案将可能不适合我。

我可能需要做的是手动序列化会话,将信息放在数据库表中,然后将密钥传递给可以读取表的服务器,然后返回时我可以从表中提取数据并更新在客户端的会话。

相关问题