2

我正在编写一个 C++ 客户端,它使用 libcurl 与 PHP 脚本进行通信。

通信应该是基于会话的,因此第一个任务是登录并让 PHP 脚本设置会话。

我不习惯使用 C++ 或 PHP 的会话。我基本上知道它与 cookie 和通信会话 id 有关。

我在 curl 主页上找不到任何演示简单会话管理用例的示例。

我假设它与 curl 中的以下一个或多个选项有关:

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

但是,例如,仅从 CURLOPT_COOKIESESSION 的文档中,我无法真正看到全局。

任何做过这个的人,请分享一段简单的代码来展示这个概念。

问候

罗伯特

4

3 回答 3

3

据我了解,如果您启用 cookie,CURL 将自动为您处理会话 cookie,只要您为会话中的每个请求重用 CURL 句柄:

CURL *Handle = curl_easy_init();

// Read cookies from a previous session, as stored in MyCookieFileName.
curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, MyCookieFileName );
// Save cookies from *this* session in MyCookieFileName
curl_easy_setopt( Handle, CURLOPT_COOKIEJAR, MyCookieFileName );

curl_easy_setopt( Handle, CURLOPT_URL, MyLoginPageUrl );
assert( curl_easy_perform( Handle ) == CURLE_OK );

curl_easy_setopt( Handle, CURLOPT_URL, MyActionPageUrl );
assert( curl_easy_perform( Handle ) == CURLE_OK );

// The cookies are actually saved here.
curl_easy_cleanup( Handle );

我不肯定您需要同时设置 COOKIEFILE 和 COOKIEJAR,但文档看起来就是这样。无论如何,您必须设置两者之一才能在 CURL 中启用 cookie。你可以做一些简单的事情:

curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );

这不会从磁盘读取任何 cookie,但会在 curl 句柄期间启用会话 cookie。

于 2008-10-15T16:28:07.143 回答
1

我有一个 bash 中命令行 curl 的示例 - 登录到 PHPMyAdmin,然后使用它的导出功能。也许它会帮助你:

#!/bin/bash

PHPMYADMINURL="http://www.example.com/phpmyadmin/"

# Username and password, has to be URL-encoded
MYUSERNAME="username"
MYPASSWORD="password"

TMPCOOKIES="$(mktemp)" || exit 1

TOKEN=$(
        curl \
                --silent \
                --show-error \
                --data @- \
                --data "lang=en-utf-8" \
                --cookie-jar "$TMPCOOKIES" \
                --dump-header - \
                --url "$PHPMYADMINURL" \
                <<< "pma_username=$MYUSERNAME&pma_password=$MYPASSWORD" \
                | egrep 'token=[0-9a-h]+' \
                | head -1 \
                | sed -r 's/^(.*token=)([0-9a-h]+)(.*)/\2/' \
        ) || exit 1

curl \
       --cookie "$TMPCOOKIES" \
       --data "token=$TOKEN" \
       --data "export_type=server" \
       --data "what=sql" \
       --data "asfile=sendit" \
       --data "sql_data=something" \
       --data "sql_columns=something" \
       --data "sql_hex_for_blob=something" \
       --data "compression=gzip" \
       --url "$PHPMYADMINURL"export.php 1>&2 || exit 1

rm -f "$TMPCOOKIES" || exit 1

PHPMyAdmin 使用除了 cookie 之外的令牌,因此代码比通常需要的要复杂一些。

于 2008-10-15T11:15:13.877 回答
-1

PHP 中的会话旨在为多个请求保留一些状态,因为 HTTP 本身是无状态的。要从 PHP 获取会话,只需请求一个启动会话的 php 页面,并保留您返回的 cookie 以供后续请求使用。

在 php 中启动会话很简单——调用 session_start() 函数。如果请求中存在 cookie,该函数将恢复现有会话。当会话启动时,可以使用超全局数组 $_SESSION 设置持久变量。在那里存储一个“已登录”令牌是个好主意 =) 要结束 PHP 会话,请将 $_SESSION 设置为 array(),以便销毁令牌。

于 2008-10-15T08:26:42.110 回答