我正在编写一个C ++客户端,它使用libcurl与PHP脚本进行通信。
通信应基于会话,因此第一项任务是登录并使PHP脚本设置会话。
我不习惯使用C ++或PHP的会话。我基本上知道它与cookie和通信会话ID有关。
我在curl主页上找不到任何一个演示简单会话管理用例的例子。
我假设它与curl中的一个或多个以下选项有关:
CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST
但我不能仅仅从CURLOPT_COOKIESESSION的文档中看到大局。
任何完成此操作的人,请分享一段显示概念的简单代码。
此致
罗伯特
答案 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(),以便销毁令牌。