【问题标题】:PHP site testing with cURL and _SESSION使用 cURL 和 _SESSION 进行 PHP 站点测试
【发布时间】:2016-03-15 23:11:51
【问题描述】:

我正在尝试进行我的第一个站点回归测试。站点后端由几个 PHP 脚本组成。因此,我只是使用 cURL 一个接一个地调用所有 PHP 文件,并使用各种有效和无效输入并检查结果。在我达到基于会话的身份验证管理之前,一切正常。我看到使用 cURL 时,_SESSION 的工作方式与从浏览器对 PHP 的正常调用不同(见下文)。如果我理解正确,这是因为会话功能需要在客户端有一个 cookie,在我这样使用 cURL 的情况下会丢失(我有点希望它会自动发生)。那么如何让 cURL 处理 cookie 并像被浏览器调用一样调用 php-files?

在下面的示例中,我希望看到“test”,但我看到的是“SESSION not set”。

调用文件:

<?php
session_start();
$_SESSION["test"] = "test";
echo sendPost('https://rodichi.net/sandbox/php/test_curl_session_called.php', null);

function sendPost($url, $data) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $result = curl_exec($ch);
    if ($result === false) {
        die(curl_error($ch));
    }
    curl_close($ch);
    return $result;
}

调用文件:

<?php
session_start();
if (isset($_SESSION['test'])) {
    echo($_SESSION['test'].'<br>');
} else {
    echo 'SESSION not set<br>';
}

【问题讨论】:

    标签: curl session-state regression-testing


    【解决方案1】:

    cURL 将为您透明地处理 cookie,但为了使它们持久存在,它们需要保存到文件中,或者您需要在后续请求中重新使用相同的 cURL 句柄,以便发送 cookie。

    您可以通过调用启用 cookie 处理:

    curl_setopt($ch, CURLOPT_COOKIEFILE, ''); // enable cookie handling
    

    然后你会提出这样的请求:

    curl_setopt($ch, CURLOPT_URL, 'http://some_url_that_sets_cookies');
    $result = curl_exec($ch);
    
    // without calling curl_close or destructing $ch
    
    curl_setopt($ch, CURLOPT_URL, 'http://another_url_that_uses_cookies');
    $result = curl_exec($ch);  // cookies from the previous request will be sent
    

    cURL 不会对 $_SESSION 全局执行任何操作,它使用 cookie 中的会话 ID 将客户端与特定会话相关联,因此您的代码示例设置 $_SESSION['test'] 然后使用 cURL 将无法按预期工作。

    如果您想在 cURL 关闭后将 cookie 保存到文件中,然后稍后恢复它们,您可以使用:

    curl_setopt($ch, CURLOPT_COOKIEFILE, './cookies.txt'); // load cookies from here
    curl_setopt($ch, CURLOPT_COOKIEJAR', './cookies.txt'); // save cookies here when curl closes
    

    希望对您有所帮助。

    【讨论】:

    • 很清楚,谢谢。还有一个问题:如果在被调用函数中检查身份验证取决于_SESSION 内容(我检查例如$_SESSION['expires'],我需要以某种方式从 cURL 写入的文件中读取会话 cookie 并根据该 cookie 设置会话内容。是否可以使用 cURL 实用程序来执行此操作,或者我应该手动执行此操作(我实际上可以在知道其 ID 的情况下恢复会话内容吗)?
    • 我不太确定你在问什么。当 cURL 发送正确的会话 cookie 时,PHP 在远程服务器上启动会话。您的 cURL 测试客户端与 $_SESSION 无关,实际上也不应该。
    • 对不起,我自己才意识到不清楚,正要删除评论,但你更快:)
    猜你喜欢
    • 2017-07-08
    • 2016-05-17
    • 1970-01-01
    • 2021-08-23
    • 2011-01-28
    • 2011-04-07
    • 2012-06-12
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多