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


Pass session information to PHP via curl

我要做的是使来自客户端程序的会话可供服务器程序使用。

这两个程序都在同一个 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,'main='.session_id((( 时,对服务器的每次调用都会按预期创建一个新的会话文件。
  • 我添加了curl_setopt($ch,CURLOPT_COOKIEFILE,$cookiefile(,以确保$cookiefile存在并且是可写的,行为没有变化。

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

经过更多的搜索,我发现了原因。 客户端脚本已锁定会话文件,因此服务器会话无法读取它,因此超时。 更多内容:PHP 会话 - 锁定和共享问题

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

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