Я пытаюсь избежать cURL хранения сессии cookie в фактический файл через "CURLOPT_COOKIEJAR". Поэтому я создал метод для поиска / анализа файлов cookie в локальной переменной, которая затем используется через CURLOPT_COOKIE для восстановления сеанса cookie.
Я вырезал файлы cookie через
preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies);
Чтобы использовать «CURLOPT_COOKIE», мы берем значение key = и разделяем их через «;». Однако (как я знаю), CURLOPT_COOKIE не позволяет вам вводить различные флаги Ie expiration, secure flag и т. Д.
Обновление 1/29/2014 18:45
Поэтому я думаю, что моя проблема на самом деле происходит там, где происходит CURLOPT_FOLLOWLOCATION. Я не думаю, что это связано с флагами. Кажется, что сеанс ручного cookie, который у меня обновляется, после нового местоположения (т. Е. На сайте есть 2-3 перенаправления для добавления различных файлов cookie / сеанса). Это будет иметь смысл, поскольку использование CURLOPT_COOKIEJAR будет напрямую захватывать / обновлять файлы cookie, отправленные при перенаправлении заголовков. Итак, я попытался создать ручной путь перенаправления при захвате / добавлении последнего файла cookie – однако этот метод не работал по какой-то простой причине.
Обновление 1/30/2014 16:22
Почти это выяснилось. Скоро будет обновление с ответом. Оказывается, мой метод работает отлично, это просто вопрос правильной перемотки вручную.
Обновление 1/30/2014 4:51 вечера Проблема решена – ответил мне ниже.
Так что получается, что я делал это правильно, и мои предположения были правильными.
Чтобы сохранить сеанс cookie в переменной (по сравнению с CURLOPT_COOKIEJAR). * Убедитесь, что включены CURLOPT_HEADER и CURLINFO_HEADER_OUT. *
Для параметра CURLOPT_FOLLOWLOCATION должно быть установлено значение false. В противном случае ваш файл cookie не будет отправлен правильно (здесь лучше всего работает CURLOPT_COOKIEJAR).
Используйте preg_match_all для извлечения файлов cookie. Затем используйте strpos, чтобы найти первое появление «=». Некоторые сайты используют кодировку и включают «=», которые не будут работать с «взрывом».
$data = curl_exec($curl); $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $header = substr($data, 0, $header_size); preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies); foreach( $cookies[1] as $cookie ){ $buffer_explode = strpos($cookie, "="); $this->cookies[ substr($cookie,0,$buffer_explode) ] = substr($cookie,$buffer_explode+1); }
При создании следующего вызова curl повторно вызовите cookie var / object в CURLOPT_COOKIE.
if( count($this->cookies) > 0 ){ $cookieBuffer = array(); foreach( $this->cookies as $k=>$c ) $cookieBuffer[] = "$k=$c"; curl_setopt($curl, CURLOPT_COOKIE, implode("; ",$cookieBuffer) ); }
Это позволит вам сохранить неповрежденную последнюю переменную (т.е. сменить сеансы).
Надеюсь, это поможет любому, кто сталкивается с этой проблемой!