Как управлять простым сеансом PHP с помощью C ++ cURL (libcurl)

StackOverflow https://stackoverflow.com/questions/203990

Вопрос

Я пишу клиент на 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(), чтобы токен был уничтожен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top