Pergunta

Eu estou escrevendo um C ++ cliente que está usando libcurl para se comunicar com um script PHP.

A comunicação deve ser sessão com base e, portanto, a primeira tarefa é a de login e fazer o script PHP configurar uma sessão.

Eu não estou acostumado a trabalhar com sessões a partir C ++ ou PHP. Basicamente, eu sei que isso tem a ver com cookies e comunicar id de sessão.

Não consigo encontrar nenhum exemplo na página inicial onda que demonstra um caso de uso de gerenciamento de sessão simples.

Eu estou supondo que ele tem algo a ver com uma ou muitas das seguintes opções na onda:

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

Mas eu não posso realmente ver a grande figura apenas a partir da documentação de CURLOPT_COOKIESESSION por exemplo.

Qualquer pessoa que tenha feito isso, por favor partilhe um simples pedaço de código que mostra o conceito.

Saudações

Robert

Foi útil?

Solução

Tanto quanto eu entendo, CURL irá lidar com cookies de sessão automaticamente para você se você permitir cookies, contanto que você reutilizar o manipulador CURL para cada solicitação na sessão:

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 );

Eu não sou positivo que você precisa para definir tanto COOKIEFILE e Cookiejar, mas a documentação faz parecer que maneira. Em qualquer caso, você tem que um conjunto de dois, a fim de habilitar os cookies em tudo na CURL. Você pode fazer algo tão simples como:

curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );

Isso não vai ler os cookies do disco, mas vai permitir cookies de sessão para a duração do punho curl.

Outras dicas

Eu tenho um exemplo para onda linha de comando em bash - logging no PHPMyAdmin e em seguida, usando a sua função de exportação. Talvez ele vai ajudar você:

#!/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 usa símbolos além de cookies para o código é um pouco mais complicado do que é geralmente necessário.

Uma sessão em PHP tem o objetivo de preservar algum estado ao longo de vários pedidos, uma vez HTTP em si é apátrida. Para obter uma sessão de PHP, basta solicitar uma página php que inicia uma sessão e manter o cookie você voltar para os pedidos subsequentes.

Iniciando uma sessão em php é simples - chamar a função session_start (). Essa função vai retomar uma sessão existsing se o cookie existe no pedido. Quando a sessão é iniciada, variáveis ??persistentes pode ser definido utilizando o superglobal array $ _SESSION. É uma boa idéia para armazenar um 'é registrado in' em token lá =) Para terminar a sessão PHP, definir $ _SESSION para array (), para que o token é destruída.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top