Also dachte ein Typ von einer anderen Firma, es wäre großartig, wenn er anstelle von Seife oder XML-RPC oder Rest oder einem anderen vernünftigen Kommunikationsprotokoll einfach alle seine Antworten als Cookies in den Header einbetten würde.
Ich muss diese Cookies als hoffentlich ein Array aus dieser Curl-Antwort herausziehen. Wenn ich einen Teil meines Lebens damit verschwenden muss, einen Parser dafür zu schreiben, werde ich sehr unglücklich sein.
Weiß jemand, wie dies einfach gemacht werden kann, vorzugsweise ohne etwas in eine Datei zu schreiben?
Ich werde sehr dankbar sein, wenn mir jemand dabei helfen kann.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'callback_SaveHeaders');
parse_str($m[1], $cookies)
, dass die Cookies in ein assoziatives Array in der$cookies
Variablenpreg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); }
Obwohl diese Frage ziemlich alt ist und die akzeptierte Antwort gültig ist, finde ich sie etwas unangenehm, da der Inhalt der HTTP-Antwort (HTML, XML, JSON, Binär oder was auch immer) mit den Headern gemischt wird.
Ich habe eine andere Alternative gefunden. CURL bietet eine Option (
CURLOPT_HEADERFUNCTION
) zum Festlegen eines Rückrufs, der für jede Antwortheaderzeile aufgerufen wird. Die Funktion empfängt das Curl-Objekt und eine Zeichenfolge mit der Kopfzeile.Sie können einen Code wie diesen verwenden (angepasst aus der TML-Antwort):
Diese Lösung hat den Nachteil, dass eine globale Variable verwendet wird, aber ich denke, dies ist kein Problem für kurze Skripte. Und Sie können immer statische Methoden und Attribute verwenden, wenn Curl in eine Klasse eingeschlossen wird.
quelle
$cookies
.$curlResponseHeaderCallback = function ($ch, $headerLine) use (&$cookies) {
danncurl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlResponseHeaderCallback);
.$class->curlResponseHeaderCallback()
? Oder haben Sie nurcurlResponseHeaderCallback
außerhalb der Klasse?Dies geschieht ohne reguläre Ausdrücke, erfordert jedoch die PECL-HTTP-Erweiterung .
quelle
pecl install
tatsächlich funktionieren würde. Grrr.Wenn Sie CURLOPT_COOKIE_FILE und CURLOPT_COOKIE_JAR verwenden, liest / schreibt curl die Cookies aus / in eine Datei. Nachdem das Einrollen abgeschlossen ist, können Sie es nach Belieben lesen und / oder ändern.
quelle
libcurl bietet auch CURLOPT_COOKIELIST, das alle bekannten Cookies extrahiert. Sie müssen lediglich sicherstellen, dass die PHP / CURL-Bindung sie verwenden kann.
quelle
Jemand hier könnte es nützlich finden. hhb_curl_exec2 funktioniert ziemlich ähnlich wie curl_exec, aber arg3 ist ein Array, das mit den zurückgegebenen http-Headern (numerischer Index) gefüllt wird, und arg4 ist ein Array, das mit den zurückgegebenen Cookies gefüllt wird ($ cookies ["expires"] => " Fr, 06-May-2016 05:58:51 GMT ") und arg5 werden mit ... Informationen über die Rohanforderung von curl gefüllt.
Der Nachteil ist, dass CURLOPT_RETURNTRANSFER aktiviert sein muss, andernfalls wird ein Fehler ausgegeben und CURLOPT_STDERR und CURLOPT_VERBOSE werden überschrieben , wenn Sie sie bereits für etwas anderes verwendet haben. (Ich könnte dies später beheben.)
Beispiel für die Verwendung:
und die Funktion selbst ..
quelle
Die akzeptierte Antwort scheint die gesamte Antwortnachricht zu durchsuchen. Dies kann zu falschen Übereinstimmungen für Cookie-Header führen, wenn das Wort "Set-Cookie" am Anfang einer Zeile steht. Während es in den meisten Fällen in Ordnung sein sollte. Der sicherere Weg könnte darin bestehen, die Nachricht vom Anfang bis zur ersten leeren Zeile durchzulesen, die das Ende der Nachrichtenkopfzeilen angibt. Dies ist nur eine alternative Lösung, die nach der ersten Leerzeile suchen und dann preg_grep in diesen Zeilen verwenden sollte, um nur "Set-Cookie" zu finden.
quelle
Nach meinem Verständnis
curl
müssen Cookies von in eine Datei (curl -c cookie_file
) geschrieben werden. Wenn Sie PHPs oder Funktionen (oder irgendetwas in dieser Familie)curl
durchlaufen , sollten Sie in der Lage sein, die Cookies in einer Datei zu speichern, dann die Datei zu öffnen und sie einzulesen.exec
system
quelle