Jede Möglichkeit, Curls Cookies im Gedächtnis und nicht auf der Festplatte zu halten

StackOverflow https://stackoverflow.com/questions/1486099

  •  18-09-2019
  •  | 
  •  

Frage

Ich mache ein paar Curl -Arbeiten in PHP 5.3.0.

Ich frage mich, ob es eine Möglichkeit gibt, das Curl -Handle/-objekt zu sagen, dass er die Cookies im Speicher halten soll (vorausgesetzt, ich verwende denselben Handle für mehrere Anfragen neuer Griff.

Es gibt diese lang anerkannte Methode, um sie in die Anfrage zu bringen:

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

Aber ich treffe einige Szenarien, in denen ich mehrere Kopien eines Skripts aus demselben Verzeichnis ausführen muss, und sie treten aufeinander aus Cookie -Dateien. Ja, ich weiß, ich könnte Tempnam () verwenden und sicherstellen, dass jeder Lauf über eine eigene Cookie -Datei verfügt, aber das führt mich zu meiner 2. Ausgabe.

Es gibt auch das Problem, diese Cookie -Dateien überhaupt auf der Festplatte zu haben. Die Festplatte I/O ist langsam und ein Flaschenhals bin ich sicher. Ich möchte mich nicht mit der Reinigung der Cookie -Datei befassen müssen, wenn das Skript fertig ist (wenn es überhaupt so ausgeht, wie ich sie aufräumen kann).

Irgendwelche Ideen? Oder ist so die Art und Weise, wie die Dinge sind?

War es hilfreich?

Lösung

Du kannst den ... benutzen CURLOPT_COOKIEJAR Option und setzen Sie die Datei auf "/dev/null" zum Linux / macos x oder "NULL" zum Fenster. Dies verhindert, dass die Cookies auf die Festplatte geschrieben werden, aber sie hält sie im Speicher, solange Sie den Griff wiederverwenden und nicht anrufen curl_easy_cleanup().

Andere Tipps

Leider glaube ich nicht, dass Sie "Php: // Speicher" als Eingabe- und Ausgabestream verwenden können. Die Problemumgehung besteht darin, die Header selbst zu analysieren. Dies kann ziemlich leicht gemacht werden. Hier ist ein Beispiel für eine Seite, die zwei Anfragen stellt und die Cookies selbst übergibt.

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:

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

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

Dies wird 'Hallo!' auf die zweite Anfrage.

Setzen Sie einfach curlopt_cookiefile auf eine Datei, die nicht vorhanden ist, normalerweise ist eine leere Zeichenfolge die beste Option. Setzen Sie dann nicht curlopt_cookiejar, dies ist der Trick. Dies verhindert, dass eine Datei geschrieben wird, aber die Cookies bleiben im Speicher. Ich habe dies gerade getestet und es funktioniert (mein Test: Senden Sie HTTP -Auth -Daten an eine URL, die Sie in eine Anmelde -URL weiterleitet, die die Anforderung authentifiziert, und dann Sie mit einem Cookie wieder in die ursprüngliche URL umleitet).

Wenn Sie Linux verwenden, können Sie diese auf irgendwo in /dev /shm einstellen. Dies hält sie im Speicher und Sie können sicher sein, dass sie nicht über Neustarts hinweg bestehen.

Ich dachte irgendwie, dass Curls Aufräumarbeiten das Verenden von Keksen behandelte, aber ich könnte mich irren.

Es gibt aber völlig unintuitiv.

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

Weitere Informationen finden Sie unter Meine Antwort in den Kommentaren

Was für mich funktioniert, ist die Verwendung dieser Einstellung:

curl_setopt($ch, CURLOPT_HEADER, 1);

Und dann das Ergebnis analysieren. Details in Dieser Blog -Beitrag Wo ich herausgefunden habe, wie man das macht.
Und da das alt ist, ist hier a GIST ersetzen veraltete Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top