【问题标题】:PHP curl post with php session (same domain)带有 php 会话的 PHP curl 帖子(同一域)
【发布时间】: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


【解决方案1】:

我找到了一个使用 file_get_contents 而不是 cURL 的解决方案。

我还必须在帖子标题中传递 $_SERVER['HTTP_COOKIE'],但出于某种原因,file_get_contents 正在工作,但 curl 并没有使会话保持活动状态。

这就是我的工作:

   session_write_close();
   $result = savethisdoc($myfields,'page2.php');
   session_start();

这就是 savethisdoc 函数

function savethisdoc($postfields,$url)
{
    $query = http_build_query($postfields);

    $opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n",'method' => 'POST','content'=> $query));
    $context = stream_context_create($opts);
    return file_get_contents($url, false, $context);
}

我正在迭代一个需要保存的“文档”数组,因此我需要为数组中的每个文档调用 savethisdoc()。

使用 curl,即使保存/关闭会话,它也不起作用(根本没有保留会话)。但是有了这个,我可以根据需要多次调用'page2.php',一点问题都没有。

没有理由为什么它适用于 file_get_contents 而不是 curl,所以它一定是 cookie/session curl 参数有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多