PHP с использованием CURL: есть ли способ эмулировать куки вместо сохранения в файл? - PullRequest
14 голосов
/ 07 декабря 2009

Я обращаюсь к сервису API REST, который использует переменную с именем session_id. API требует, чтобы это было сохранено в куки, и я выполняю это следующим образом:

$ch = curl_init();    // initialize curl handle

        curl_setopt($ch, CURLOPT_URL, $url); //set target URL
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);// allow redirects
        curl_setopt($ch, CURLOPT_COOKIEFILE, './Cookie.txt');
        curl_setopt($ch, CURLOPT_COOKIEJAR, './Cookie.txt');
        curl_setopt($ch, CURLOPT_POST, TRUE); // set POST method
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, TRUE); //return the headers so we can get session id
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //prevent unverified SSL certificate error
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //prevent unverified SSL ""

        $contents = curl_exec($ch);
        curl_close($ch);

Теперь проблема в том, что это вызывается многими разными пользователями. (так много разных файлов cookie должны быть сохранены) Я хотел бы просто сохранить session_id в переменной вместо ссылки на файл cookie. Пока что все мои попытки отклонены службой. Кто-нибудь может предложить методы для сохранения идентификатора сеанса и информации cookie, не сохраняя ее в файл? Обратите внимание, что чтение идентификатора сеанса не проблема, он возвращается в XML. По какой-то причине передача его обратно без ссылки на фактически созданный файл не передает учетные данные безопасности. Любая дополнительная информация о том, почему это может быть полезным.

Ответы [ 3 ]

21 голосов
/ 07 декабря 2009

Cookies - это простые текстовые заголовки, отправляемые вместе с запросом. CURL позволяет вам указать тех, кто напрямую использует CURLOPT_COOKIE.

curl_setopt($ch, CURLOPT_COOKIE, 'key=value;anotherkey=anothervalue');

Если вы знаете, какую информацию отправлять, вы можете создать свой собственный заголовок cookie таким образом. Опции COOKIEJAR / COOKIEFILE просто автоматизируют разбор, сохранение и отправку. Вам придется делать это вручную (читать полученные заголовки Cookie, создавать заголовки Cookie для отправки), если вы не хотите записывать в файл.

8 голосов
/ 07 декабря 2009

Вот хороший пример,

http://sgjoomla.googlecode.com/svn/trunk/joomla/curltest.php

По какой-то причине часть cookie закомментирована, но весь необходимый вам код все еще там.

По сути, вы сами разбираете заголовки "Set-Cookie" и сохраняете значение cookie, делая это,

  curl_setopt ($ch, CURLOPT_HEADERFUNCTION, 'read_header');

Поместите значение cookie в глобальное значение. При следующем вызове установите его следующим образом:

  curl_setopt($ch, CURLOPT_COOKIE, "$cookieName=$cookieValue");
4 голосов
/ 07 декабря 2009

Я использую tempnam для создания уникального имени файла.

$ckfile = tempnam ("/tmp", "cookieMyWeb");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 

Создайте новое имя файла перед использованием curl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...