Jadi beberapa orang di beberapa perusahaan lain berpikir itu akan luar biasa jika alih-alih menggunakan sabun atau xml-rpc atau istirahat atau protokol komunikasi masuk akal lainnya, dia hanya menyematkan semua tanggapannya sebagai cookie di tajuk.
Saya perlu mengeluarkan cookie ini karena mudah-mudahan merupakan array dari respons curl ini. Jika saya harus menyia-nyiakan banyak hidup saya menulis parser untuk ini, saya akan sangat tidak bahagia.
Adakah yang tahu bagaimana ini bisa dilakukan dengan mudah, lebih disukai tanpa menulis apapun ke file?
Saya akan sangat berterima kasih jika ada yang bisa membantu saya dalam hal ini.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'callback_SaveHeaders');
parse_str($m[1], $cookies)
, yang akan memasukkan cookie ke dalam array asosiatif dalam$cookies
variabel ....preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); }
Meskipun pertanyaan ini sudah cukup lama, dan respons yang diterima valid, saya merasa agak tidak nyaman karena konten respons HTTP (HTML, XML, JSON, biner, atau apa pun) bercampur dengan header.
Saya telah menemukan alternatif lain. CURL menyediakan opsi (
CURLOPT_HEADERFUNCTION
) untuk menyetel panggilan balik yang akan dipanggil untuk setiap baris header respons. Fungsi ini akan menerima objek curl dan string dengan garis header.Anda dapat menggunakan kode seperti ini (diadaptasi dari respons TML):
Solusi ini memiliki kelemahan menggunakan variabel global, tapi saya rasa ini bukan masalah untuk skrip pendek. Dan Anda selalu dapat menggunakan metode dan atribut statis jika curl digabungkan ke dalam kelas.
sumber
$cookies
.$curlResponseHeaderCallback = function ($ch, $headerLine) use (&$cookies) {
lalucurl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlResponseHeaderCallback);
.$class->curlResponseHeaderCallback()
? Atau apakah Anda baru saja dicurlResponseHeaderCallback
luar kelas?Ini melakukannya tanpa regexps, tetapi membutuhkan ekstensi HTTP PECL .
sumber
pecl install
benar-benar berhasil. Grrr.Jika Anda menggunakan CURLOPT_COOKIE_FILE dan CURLOPT_COOKIE_JAR curl akan membaca / menulis cookie dari / ke file. Anda dapat, setelah curl selesai, membaca dan / atau memodifikasinya sesuka Anda.
sumber
libcurl juga menyediakan CURLOPT_COOKIELIST yang mengekstrak semua cookie yang dikenal. Yang Anda butuhkan hanyalah memastikan pengikatan PHP / CURL dapat menggunakannya.
sumber
seseorang di sini mungkin merasa berguna. hhb_curl_exec2 bekerja sangat mirip dengan curl_exec, tetapi arg3 adalah larik yang akan diisi dengan header http yang dikembalikan (indeks numerik), dan arg4 adalah larik yang akan diisi dengan cookie yang dikembalikan ($ cookies ["expires"] => " Jum, 06-Mei-2016 05:58:51 GMT "), dan arg5 akan diisi dengan ... info tentang permintaan mentah yang dibuat oleh curl.
downside adalah bahwa itu membutuhkan CURLOPT_RETURNTRANSFER untuk aktif, jika tidak kesalahan akan keluar, dan itu akan menimpa CURLOPT_STDERR dan CURLOPT_VERBOSE, jika Anda sudah menggunakannya untuk hal lain .. (saya mungkin memperbaikinya nanti)
contoh cara menggunakannya:
dan fungsinya sendiri ..
sumber
Jawaban yang diterima sepertinya akan menelusuri seluruh pesan respons. Ini bisa memberi Anda kecocokan palsu untuk header cookie jika kata "Set-Cookie" ada di awal baris. Meskipun seharusnya baik-baik saja dalam banyak kasus. Cara yang lebih aman mungkin dengan membaca pesan dari awal hingga baris kosong pertama yang menunjukkan akhir header pesan. Ini hanyalah solusi alternatif yang harus mencari baris kosong pertama dan kemudian menggunakan preg_grep pada baris tersebut hanya untuk menemukan "Set-Cookie".
sumber
Pemahaman saya adalah bahwa cookie dari
curl
harus ditulis ke file (curl -c cookie_file
). Jika Anda menjalankancurl
melalui PHPexec
atausystem
fungsi (atau apa pun di keluarga itu), Anda harus dapat menyimpan cookie ke file, lalu buka file dan membacanya di.sumber