Как управлять простым сеансом PHP с помощью C ++ cURL (libcurl)
Вопрос
Я пишу клиент на C ++, который использует libcurl для взаимодействия с PHP-скриптом.
Связь должна быть основана на сеансе, и, таким образом, первая задача - войти в систему и заставить PHP-скрипт настроить сеанс.
Я не привык работать с сессиями ни на C ++, ни на PHP.Я в принципе знаю, что это связано с файлами cookie и идентификатором сеанса передачи данных.
Я не могу найти ни одного примера на домашней странице curl, который демонстрировал бы простой вариант использования управления сеансами.
Я предполагаю, что это как-то связано с одним или многими из следующих параметров в curl:
CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST
Но я не могу увидеть общую картину только из документации CURLOPT_COOKIESESSION, например.
Любой, кто делал это, пожалуйста, поделитесь простым фрагментом кода, который показывает концепцию.
С уважением
Роберт
Решение
Насколько я понимаю, CURL будет автоматически обрабатывать сеансовые файлы cookie для вас, если вы включите файлы 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, но из документации так кажется.В любом случае, вы должны установить одно из двух, чтобы вообще включить cookies в CURL.Вы можете сделать что-то такое же простое, как:
curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );
Это не приведет к считыванию никаких файлов cookie с диска, но позволит использовать сеансовые файлы cookie на время действия дескриптора curl.
Другие советы
У меня есть пример для командной строки curl в bash - вход в 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, поэтому код немного сложнее, чем обычно требуется.
Сеанс в PHP предназначен для сохранения некоторого состояния в течение нескольких запросов, поскольку HTTP сам по себе не имеет состояния.Чтобы получить сеанс из PHP, просто запросите страницу php, которая запускает сеанс, и сохраните файл cookie, который вы получите обратно для последующих запросов.
Запустить сеанс в php просто - вызовите функцию session_start().Эта функция возобновит существующий сеанс, если файл cookie существует в запросе.Когда сеанс запущен, постоянные переменные могут быть установлены с помощью суперглобального массива $_SESSION.Хорошей идеей будет сохранить там токен 'is logged in' =) Чтобы завершить сеанс PHP, установите $_SESSION в array(), чтобы токен был уничтожен.