2009-09-28 11 views
30

Robię trochę pracy cURL w php 5.3.0.Jakikolwiek sposób na przechowywanie ciasteczka curl w pamięci, a nie na dysku

Zastanawiam się, czy istnieje jakikolwiek sposób, aby powiedzieć uchwytowi/obiektowi do przechowywania plików cookie w pamięci (zakładając, że używam tego samego uchwytu dla wielu żądań), lub jakoś je zwrócić i pozwolić mi je przekazać z powrotem podczas robienia nowego uchwytu.

Theres tak długo akceptowanym sposobem na uzyskanie ich w/na wniosek:

curl_setopt($ch, CURLOPT_COOKIEJAR, $filename); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $filename); 

Ale ja uderzanie kilka scenariuszy, w których muszę być uruchomiony wiele kopii skryptu z tego samego katalogu, i nakładają na siebie pliki cookie. Tak, wiem, że mógłbym użyć funkcji tempnam() i upewnić się, że każdy program ma własny plik cookie, ale to prowadzi mnie do drugiego problemu.

Istnieje również problem z posiadaniem tych plików cookie na dysku. Dysk I/O jest powolny i pewna jest butelka. Nie chcę mieć do czynienia z czyszczeniem pliku cookie po zakończeniu skryptu (jeśli nawet kończy się to w taki sposób, że mogę go wyczyścić).

Wszelkie pomysły? Czy tak po prostu są rzeczy?

+7

Szczerze mówiąc, nie sądzę, musisz się martwić dysku I/O, gdy robisz Network I/O. – NSSec

Odpowiedz

23

Można użyć opcji CURLOPT_COOKIEJAR i ustaw plik do "/dev/null" dla Linux/MacOS X lub "NULL" dla systemu Windows . Zapobiegnie to zapisywaniu plików cookie na dysk, ale zachowa je w pamięci, dopóki użyjesz ponownie uchwytu i nie zadzwonisz pod numer curl_easy_cleanup().

+0

A więc pliki cookie będą ważne do momentu wywołania curl_close()? Testowałeś to? –

+14

Przeczytałem kod źródłowy biblioteki libcurl, aby to zweryfikować przed opublikowaniem. –

+2

Próbowałem go i to nie działa. Ani w Windows, ani w * nix. –

2

Jeśli używasz Linuksa, możesz ustawić je tak, aby wskazywały gdzieś w/dev/shm .. to będzie je przechowywać w pamięci i możesz mieć pewność, że nie przetrwają one po ponownym uruchomieniu.

W jakiś sposób myślałem, że porządek Curl zajmował się rozłączaniem ciasteczek, ale mógłbym się mylić.

+0

Czy możesz podać działającą implementację? –

25

Niestety, nie sądzę, że możesz użyć "php: // memory" jako strumienia wejściowego i wyjściowego. Obejście problemu polega na samodzielnym analizowaniu nagłówków. Można to zrobić całkiem łatwo. Oto przykład strony składającej dwie prośby i sam przekazującej pliki cookie.

curl.php:

<?php 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'http://localhost/test.php?message=Hello!'); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($curl, CURLOPT_HEADER, true); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$data = curl_exec($curl); 
curl_close($curl); 

preg_match_all('|Set-Cookie: (.*);|U', $data, $matches); 
$cookies = implode('; ', $matches[1]); 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'http://localhost/test.php'); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($curl, CURLOPT_HEADER, true); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_COOKIE, $cookies); 

$data = curl_exec($curl); 
echo $data; 

?> 

test.php: 'Hello'

<?php 
session_start(); 
if(isset($_SESSION['message'])) { 
    echo $_SESSION['message']; 
} else { 
    echo 'No message in session'; 
} 

if(isset($_GET['message'])) { 
    $_SESSION['message'] = $_GET['message']; 
} 
?> 

Będzie to wyjście na drugim wniosku.

+2

Ten kod pomógł mi ogromnie podziękować –

+2

Pamiętaj, że jeśli parsujesz ciasteczka więcej niż raz w sekwencji żądań, być może będziesz musiał zebrać pliki cookie w swoim ciągu, prawdopodobnie zastępując starsze wartości nowszymi dla ponownego pojawienia się kluczy. (... i zaczyna się śliskie nachylenie, aby zaimplementować słoik z ciasteczkami!) –

8

Po prostu ustaw CURLOPT_COOKIEFILE na plik, który nie istnieje, zwykle najlepszym opcją jest pusty ciąg znaków. Następnie NIE ustawiaj CURLOPT_COOKŻYAR, to jest podstęp. Zapobiegnie to zapisywaniu pliku, ale pliki cookie pozostaną w pamięci. Właśnie to przetestowałem i działa (mój test: wyślij http auth danych do adresu URL, który przekierowuje cię do adresu URL logowania, który uwierzytelnia żądanie, a następnie przekierowuje cię z powrotem do oryginalnego adresu URL z plikiem cookie).

+1

Genialny, dokładnie tego szukałem. Ustawiłem 'CURLOPT_COOKIEFILE' na' null' i powstrzymałem się od ustawienia opcji 'CURLOPT_COOKIEJAR', i zadziałało! – silkfire

0

Jest, ale jest całkowicie nieintuicyjny.

curl_setopt($curl, CURLOPT_COOKIEFILE, ""); 

Aby uzyskać więcej informacji proszę zobaczyć my answer in the comments

Powiązane problemy