【发布时间】:2023-03-29 23:24:01
【问题描述】:
我需要从一个 PHP 页面 (page1.php) 向同一域/应用程序中的另一个 PHP 页面 (page2.php) 发出 POST 请求。
'Page2.php' 使用 session_start() 来获取一些用户存储的信息。该页面无法修改,因为它也用于 JS ajax 请求等。 此外,'page1.php' 有 session_start() 因为它还需要一些用户数据。
我遇到的问题是,如果我从 page1.php 发出 cURL POST 请求,则 page2.php 无法识别会话(但是,它适用于 JS ajax 请求)。
经过几个小时的尝试,我终于找到了解决方案:
[page1.php]
session_start();
$useragent = $_SERVER['HTTP_USER_AGENT'];
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
session_write_close();
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://example.com/page2.php",
CURLOPT_POST => true,
CURLOPT_HEADER => false,
CURLOPT_COOKIESESSION => true,
CURLOPT_USERAGENT => $useragent,
CURLOPT_COOKIE => $strCookie,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => [my_fields_array]
]);
$output = curl_exec($ch);
echo "$output";
curl_close($ch);
[page2.php](只是一个缩小的样本)
$session_start();
echo $_SESSION['some_var'];
我也尝试过使用 CURLOPT_COOKIEJAR、CURLOPT_COOKIEFILE 等,但对我不起作用(不知道为什么)。
经过一些尝试,我终于注意到真正需要的行是这样的:
session_write_close();
但是如果我调用 curl 两次,它只对其中一个起作用。
我的意思是:如果在一个成功的结果之后,我“刷新”page1.php,那么 curl 不会发送会话(或者 page2 没有得到它)。
如果我再次执行(刷新)page1.php,那么它将再次成功,但在下一次刷新时将无法正常工作。
是否可以避免这种情况? session_write_close() 真的需要吗?关闭 curl 后是否必须再次调用 session_start() ?
我也尝试了另一种方法从 php 发布数据,但似乎它们都有相同的 cookie/会话问题。
【问题讨论】:
-
session_write_close 将写入会话数据,但 END 它。所以尝试将 curl 放入一个单独的 php(称为 page1to2.php)并在 page1.php 的末尾调用它(这将帮助您自动编写会话数据而不结束它)
-
我很好奇如果 PHP 文件在同一个应用程序中,为什么你“需要”发送 curl 请求?
-
'page2.php' 已制作完成,并准备好获取 post 参数并执行一些繁重的工作。我可以只做一个'include page2.php'或类似的东西,但我认为只做一个cURL帖子更容易。如果有替代品,我会试试的!
标签: php session curl post request