Bellek ve disk değil Curl çerezlerini tutmak için herhangi bir yolu

4 Cevap php

Ben php 5.3.0 bazı cURL işi yapıyorum.

Yaparken (birden çok istekleri aynı tanıtıcı yeniden yaşıyorum varsayarak), ya da bir şekilde onları geri ve bana onları geri geçmesine izin bellekte çerezleri tutmak için kıvırmak kolu / nesneyi anlatmak için herhangi bir yol olup olmadığını merak ediyorum bir yeni bir kolu.

Orada bu kadar uzun / isteği dışında onları almak için kabul edilen yöntem:

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

Ama ben aynı dizin dışında bir komut dosyası birden çok kopyasını çalıştıran gerekir, ve birbirlerinin çerez dosyalar üzerinde adım bazı senaryolar vuruyorum. Evet, ben tempnam () kullanın ve her bir çalışma kendi çerez dosyası vardır emin olabilir biliyorum, ama bu benim 2. sayısında beni neden olur.

Tüm diskte bu tanımlama dosyaları olan sorunu da vardır. Disk I / O yavaş ve bir şişe boyun eminim. Ben (o bile bana bunu temizlemek sağlayan bir şekilde çıkar ise) komut bittiğinde çerez dosyasını temizlik ile uğraşmak zorunda istemiyorum.

Herhangi bir fikir? Ya da bu sadece şeyler yoludur?

4 Cevap

Sen (Linux / MacOS X) veya "NUL" (Windows) CURL_COOKIEJAR seçeneğini kullanın ve "/dev/null" dosya ayarlayabilirsiniz. Bu diske yazılı olmaktan çerezleri engellemek, ancak bu sürece kolunu yeniden ve curl_easy_cleanup() deme gibi bellekte etrafında onları koruyacaktır.

Ne yazık ki, ben size giriş ve çıkış akımı olarak 'php :/ / bellek kullanabilirsiniz sanmıyorum. Geçici çözüm başlıklarını kendinizi ayrıştırmak için. Bu oldukça kolayca yapılabilir. Burada bir sayfa iki isteklerini yapma ve çerezleri kendinizi geçen bir örnektir.

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;

?>

dnm.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'];
}
?>

Bu irade çıktı 'Merhaba!' ikinci istek üzerine.

Var olmayan bir dosyaya sadece set CURLOPT_COOKIEFILE, genellikle boş bir dize en iyi seçenektir. Sonra CURLOPT_COOKIEJAR set ETMEYİN, bu hiledir. Bu yazılı olan bir dosyayı engeller ama kurabiye belleğinde kalacaktır. Ben sadece bu test ve (benim test: talebini doğrular bir giriş URL'ye yönlendirir bir URL'ye http auth veri göndermek, sonra bir çerez ile geri orijinal URL'ye yönlendirir) çalışır.

Linux kullanıyorsanız, bu bellekte onları tutacak yerde / dev / shm içinde .. işaret etmek bu ayarlayabilirsiniz ve onlar yeniden botlar arasında geçerli olmayacak emin olabilirsiniz.

Ben nasılsa Curl en temizleme kurabiye bağlantısını kesmek ele düşündüm, ama yanlış olabilir.