如何使用C ++ cURL(libcurl)管理简单的PHP会话

时间:2008-10-15 08:10:34

标签: php c++ session curl libcurl

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

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

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

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

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

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

但我不能仅仅从CURLOPT_COOKIESESSION的文档中看到大局。

任何完成此操作的人,请分享一段显示概念的简单代码。

此致

罗伯特

3 个答案:

答案 0 :(得分:3)

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

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,但它会在卷曲句柄的持续时间内启用会话cookie。

答案 1 :(得分: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之外还使用令牌,因此代码比通常需要的要复杂一些。

答案 2 :(得分:-1)

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

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