PHP 使用 cURL 和 _SESSION 进行站点测试

PHP site testing with cURL and _SESSION

我正在尝试进行我的第一个站点回归测试。站点后端由几个 PHP 脚本组成。因此,我只是使用 cURL 一个接一个地调用所有 PHP 个文件,并使用各种有效和无效输入并检查结果。在我到达基于会话的身份验证管理之前,一切正常。我看到使用 cURL,_SESSION 的工作方式与从浏览器正常调用 PHP 的方式不同(见下文)。如果我理解正确的话,这是因为会话功能需要在客户端有一个 cookie,而如果按照我的方式使用 cURL,则缺少该 cookie(我有点希望它会自动发生)。那么如何让 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 将透明地为您处理 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

希望对您有所帮助。