2010-03-11 3 views
19

Как мы можем поддерживать сеанс в cURL?Как сохранить сеанс в cURL в php?

У меня есть код, который отправляет регистрационную информацию о сайте и успешно регистрируется Мне нужно, чтобы сессия поддерживалась на сайте, чтобы продолжить.

вот мой код, который используется для входа на сайт с помощью Curl

<?php 
     $socket = curl_init(); 
     curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com"); 
    curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.com"); 
    curl_setopt($socket, CURLOPT_POST, true); 
    curl_setopt($socket, CURLOPT_USERAGENT, $agent); 
    curl_setopt($socket, CURLOPT_POSTFIELDS, "form_logusername=XXXXX&form_logpassword=XXXXX"); 
    curl_setopt($socket, CURLOPT_COOKIESESSION, true); 
    curl_setopt($socket, CURLOPT_COOKIEJAR, "cookies.txt"); 
    curl_setopt($socket, CURLOPT_COOKIEFILE, "cookies.txt"); 
    $data = curl_exec($socket); 
    curl_close($socket); 
    ?> 

ответ

2

Так как вы имеете в виду cookies.txt файл без какой-либо ссылки в папку мой первый бы предположить, что вы пытаясь записать файл в папку, недоступную для записи. Поэтому сначала проверьте, действительно ли вы находите файл cookie.txt, и если он содержит файлы cookie (ы) сеанса, которые вы ожидаете.

+0

Спасибо за быстрый повтор папка содержит файл cookies.txt и это writble с разрешениями 777 –

+0

Он пуст? Curl обрабатывает файлы cookie сеанса как не истекающие. Если нет, попробуйте сначала обрезать его. Также вы должны установить CURLOPT_FOLLOWLOCATION, чтобы убедиться, что вы завершили вход в систему – symcbean

0

Я бы, вероятно, переместил этот код в функцию. После успешного входа в систему теперь у вас есть сеанс, связанный с файлом cookie, который у вас есть в файле cookie.txt. При последующих запросах просто продолжайте использовать этот файл cookie, и у вас должен быть действительный сеанс на этом сайте.

11

Вот лучший способ я нашел, чтобы сделать это link:

текст ниже является «ремикс» версия содержания blogpost:

$useragent = $_SERVER['HTTP_USER_AGENT']; 
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/'; 

session_write_close(); 

$ch = curl_init(); 
$ch = curl_init($rssFeedLink); 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_COOKIE, $strCookie); 

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

Что session_write_close() делать? Он завершает текущий сеанс и сохраняет данные сеанса. По-видимому, PHP не нравится, когда несколько скриптов играют с сеансом, поэтому он блокирует его. Помещение session_write_close гарантирует, что ваш текущий сеанс будет сохранен, чтобы вы могли его восстановить и использовать.

Если вы не используете session_write_close(), вместо использования текущего идентификатора сеанса будет создан новый идентификатор сеанса.

Также PHPSESSID следует заменить на имя переменной сеанса. Согласно OWSAP recommandations это должно быть нечто более общее, как anId.

Иногда вам нужно будет отправить пользовательский агент с сообщением, поэтому я включил параметр CURLOPT_USERAGENT.

8

Это, как вы Curl с сеансами

//initial request with login data 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php'); 
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name'); //could be empty, but cause problems on some hosts 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp'); //could be empty, but cause problems on some hosts 
$answer = curl_exec($ch); 
if (curl_error($ch)) { 
    echo curl_error($ch); 
} 

//another request preserving the session 

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile'); 
curl_setopt($ch, CURLOPT_POST, false); 
curl_setopt($ch, CURLOPT_POSTFIELDS, ""); 
$answer = curl_exec($ch); 
if (curl_error($ch)) { 
    echo curl_error($ch); 
} 

Я видел это на ImpressPages

Смежные вопросы