Как управлять простой сессией PHP с помощью C ++ cURL (libcurl) - PullRequest
2 голосов
/ 15 октября 2008

Я пишу клиент C ++, который использует libcurl для связи с PHP-скриптом.

Связь должна основываться на сеансе, и поэтому первая задача - войти в систему и заставить скрипт PHP настроить сеанс.

Я не привык работать с сессиями из C ++ или PHP. Я в основном знаю, что это связано с файлами cookie и передачей идентификатора сеанса.

Я не могу найти ни одного примера на домашней странице curl, которая демонстрирует простой пример использования управления сеансом.

Я предполагаю, что это как-то связано с одним или многими из следующих параметров в curl:

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

Но я не могу увидеть общую картину, например, из документации CURLOPT_COOKIESESSION.

Всем, кто это сделал, поделитесь простым кусочком кода, который демонстрирует концепцию.

Привет

Роберт

Ответы [ 3 ]

3 голосов
/ 15 октября 2008

Насколько я понимаю, CURL будет автоматически обрабатывать сеансовые куки для вас, если вы включите куки, если вы повторно используете свой дескриптор 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. Вы можете сделать что-то простое, как:

curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );

Это не будет читать файлы cookie с диска, но позволит включить сеансовые файлы cookie на время работы с curl.

1 голос
/ 15 октября 2008

У меня есть пример для командной строки 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 использует токены помимо куки, поэтому код немного сложнее, чем обычно требуется.

0 голосов
/ 15 октября 2008

Сеанс в PHP имеет целью сохранение некоторого состояния в течение нескольких запросов, поскольку сам по себе HTTP не имеет состояния. Чтобы получить сеанс из PHP, просто запросите страницу php, которая запускает сеанс, и сохраните полученный файл cookie для последующих запросов.

Начать сессию в php просто - вызовите функцию session_start (). Эта функция возобновит существующий сеанс, если в запросе существует файл cookie. Когда сеанс запущен, постоянные переменные могут быть установлены с использованием суперглобального массива $ _SESSION. Рекомендуется хранить токен 'logged in' там =) Чтобы завершить сеанс PHP, установите $ _SESSION в array (), чтобы токен был уничтожен.

...