2009-11-25 24 views
19

file_get_contents isteği yapılırken uzak sunucu tarafından ayarlanan tanımlama bilgilerini almak mümkün mü?file_get_contents çerezleri alır

http isteği yapmak, tanımlama bilgilerini saklamak ve saklı çerezleri kullanarak ikinci bir http isteği yapmak için php'ye ihtiyacım var.

+0

hiçbir şekilde bu soruna geçici bir çözüm için? – Grigor

+0

[cURL] (http://php.net/manual/en/book.curl.php) aradığınız şeydir. Ancak 'file_get_contents()' işlevini kullanmayacaksınız, bir cURL işlevi kullanıyor olacaksınız. (Not: PHP belgelerine bağlandım ama php.net şu anda çalışmıyor, "php curl" ve önbelleğe alınmış sayfalara bakmayı düşünüyorum) – jedwards

+0

Çerezlerin istemci tarafında olduğunu düşünüyorum, hm? file_get_contents neden çerez alabilir? –

cevap

18

Bu amaçla cURL kullanmanız gerekir, cURL çerezleri bir dosyaya kaydetmeye izin veren ve sonraki istekler için yeniden kullanılabilecek bir tanımlama bilgisi adı verilen bir özellik uygular. İşte

hızlı bir kod gelip bunu nasıl Snippet:

/* STEP 1. let’s create a cookie file */ 
$ckfile = tempnam ("/tmp", "CURLCOOKIE"); 
/* STEP 2. visit the homepage to set the cookie properly */ 
$ch = curl_init ("http://somedomain.com/"); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
$output = curl_exec ($ch); 

/* STEP 3. visit cookiepage.php */ 
$ch = curl_init ("http://somedomain.com/cookiepage.php"); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
$output = curl_exec ($ch); 

not: Eğer pecl uzantısına sahip olmalıdır kaydetti (veya PHP içinde derlenmiş) yüklü ya da erişemez edilecek olan cURL API'sine.

+0

Çerezleri bir değişkende saklamak mümkün mü, diske yazmayı engellemeye çalışıyordum. Sadece bir çerez değerini çıkarmam gerekiyor. –

+0

Böyle görünmüyor. Bir geçici dosya oluşturmak ve işiniz bittikten sonra kaldırmak için http://www.php.net/manual/en/function.tempnam.php adresini kullanın. – ceejayoz

+0

@Louis: curl ile değil ama her neyse, bir kaç bayt dosyası var ve işiniz bittikten sonra sadece 'unlink' yapabilirsiniz. – RageZ

1

Zend_Http nesnesiyle bunu kolayca yapabilirsiniz. İşte bir istek için adding cookies ile ilgili belgeler.

sadece Zend_Http nesne üzerinde getCookieJar() kullanın istek (otomatik inanıyorum alınan) çerezleri almak için. Uygulaması kolay olmalıdır;

Ancak, php kılavuzunun how to deal with cookies using the http stream üzerinde bir kullanıcı yorumu vardır.

13

Bunun geç olduğunu anlıyorum, ama aslında sunucu tarafından gönderilen tekil tanımlama bilgilerini almanın bir yolu var.

Tüm file_create_context işini nasıl yapacağınızı bildiğinizi farzediyorum, file_get_contents http isteğinizi almayı ve yalnızca çerezleri ayarlama konusunda yardıma ihtiyacınız var.

bir url üzerinde file_get_contents çalıştırdıktan sonra, (maalesef birleştirici olmayan) dizi $ http_response_header ayarlanır. , Sen substr ile çıkarabilir: Sunucu bir çerez geri gönderiyorsa

, bunlardan biri 'Set-Cookie' ile başlayacak.

Ancak şu anda, bir ben şu anda geçici bir çözüm için bir yol bulmaya çalışıyorum bir sınırlamadır bu değişken aracılığıyla-Cookie Set -one- erişmek yalnızca Bunu bana görünür.

$cookies=array(); 
foreach($http_response_header as $s){ 
    if(preg_match('|^Set-Cookie:\s*([^=]+)=([^;]+);(.+)$|',$s,$parts)) 
     $cookies[$parts[1]]=$parts[2]; 
    } 

NOTLAR: Laereom cevabı itibaren ardından

+0

Mükemmel, ve orijinal soruya en iyi yanıtı ekledim. bu işlev. –

+0

Çoklu 'Set-Cookie 'satırları' $ http_response_header'; Ayrıca ilgili bir cevap bakın: http://stackoverflow.com/a/10958820/1338292 –

+0

Sadece bize "tüm stream_create_context iş yapmak nasıl bilmiyorum" için örnek bir kod gösterebilir eğer gerçekten minnettar olurdu file_get_content'larınızın http isteği iletilmesini sağlayın "' – azerafati

6

, burada birden fazla çerez almak için nasıl ben regex ile liberalim

  1. ; Daha kesin olmak istiyorsanız RFC'leri inceleyin (örn. kötü biçimlendirilmiş çerez verilerini reddetmek için)
  2. $ parçalarında [3] path =, expires =, vb. bulacaksınız. Ben emin değilim çünkü bu özelliklere için sabit düzen varsa explode(';',$parts[3]) sonra başka döngü (işlemek için öneririm.
  3. iki kurabiye doğru olarak görünüyorsa aynı ad bölümünü, sadece son hayatta kalır, varsa .(Benim şimdiki projede bu durum var olur;. Bunu ben ekran kazıma olduğum web sitesinde bir hata olduğunu varsayalım)
+0

Takip için teşekkürler. Daha sonra bunun doğru olduğunu keşfettim, ancak orijinal cevabı düzeltmek için hiçbir zaman izlemedim. – Laereom

21

bunun için sihirli bir değişken var, $http_response_header denilen; Alınan tüm başlıkları içeren bir dizidir. Çerezleri çıkarmak için Set-Cookie: ile başlayan başlıkların filtrelenmesi gerekir.

file_get_contents('http://example.org'); 

$cookies = array(); 
foreach ($http_response_header as $hdr) { 
    if (preg_match('/^Set-Cookie:\s*([^;]+)/', $hdr, $matches)) { 
     parse_str($matches[1], $tmp); 
     $cookies += $tmp; 
    } 
} 
print_r($cookies); 

bir eşdeğer fakat daha az büyülü bir yaklaşım stream_get_meta_data() kullanmak olacaktır:

if (false !== ($f = fopen('http://www.example.org', 'r'))) { 
     $meta = stream_get_meta_data($f); 
     $headers = $meta['wrapper_data']; 

     $contents = stream_get_contents($f); 
     fclose($f); 
} 
// $headers now contains the same array as $http_response_header 
+0

@GaryCarlyleCook yapmak istediğiniz şeye bağlıdır; içerik getirmeyi değil, çerez verilerinin getirilmesini gösterme konusunda daha fazla niyetlenmedi –

İlgili konular