2009-09-28 22 views
30

我在php 5.3.0中做了一些cURL工作。任何方式來保持curl的cookie在內存中,而不是在磁盤上

我想知道是否有任何方法可以告訴curl句柄/對象將cookies保存在內存中(假設我對多個請求重複使用相同的句柄),或者以某種方式返回它們並讓我通過它們當做一個新的句柄時回來。

的Theres這漫長的接受讓他們輸入/輸出請求的方法:

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

但是我打了一些情景,我需要運行一個腳本的多個副本出同一個目錄中,並且他們踩在每個其他cookie文件上。是的,我知道我可以使用tempnam()並確保每次運行都有它自己的cookie文件,但是這導致我的第二個問題。

還有具有磁盤上,這些Cookie文件在所有的問題。磁盤I/O速度很慢,我確定它是一個瓶頸。我不想在腳本完成時處理清理cookie文件(如果它甚至以讓我清理它的方式退出)。

任何想法?或者這只是事情的方式?

+7

老實說,我不認爲你必須擔心磁盤I/O,當你做網絡I/O。 – NSSec 2009-09-28 09:18:34

回答

23

可以使用CURLOPT_COOKIEJAR選項,並設置文件爲 「/dev/null」 爲的Linux/MacOS X的或 「NULL」 爲的Windows。這樣可以防止將cookies寫入磁盤,但只要您重複使用句柄並且不要撥打curl_easy_cleanup(),它就會將它們保留在內存中。

+0

所以這些餅乾將有效,直到curl_close()被調用?你測試過了嗎? – 2009-11-05 22:11:54

+14

我在發佈之前通過libcurl源代碼進行了讀取驗證。 – 2009-11-18 02:19:04

+2

我試過了,它似乎沒有工作。無論是在Windows中還是在* nix中。 – 2010-05-20 17:20:48

2

如果使用Linux,你可以設置這些點內的某處的/ dev/shm的..這將保留在內存中,你可以放心,他們不會跨越重新啓動依然存在。

不知何故,我認爲,捲曲的清理處理餅乾取消鏈接,但我可能是錯誤的。

+0

你能提供一個工作實現嗎? – 2010-07-23 12:28:35

25

不幸的是,我不認爲你可以使用的PHP://內存「作爲輸入和輸出流。解決方法是自己解析標題。這可以很容易地完成。以下是一個頁面的示例,您可以自行發送兩個請求並傳遞Cookie。

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

這將輸出在第二個請求。

+2

此代碼幫助我非常感謝您 – 2010-06-25 19:51:41

+2

請注意,如果您在一系列請求中多次解析Cookie,則可能必須在您的字符串中累積Cookie,可能會用較新的值覆蓋較舊的值以用於重新生成的密鑰。 (..和實施餅乾罐子的滑坡開始!) – 2013-05-02 23:49:03

8

只需設置CURLOPT_COOKIEFILE到不存在的,通常是一個空字符串是最好的選擇一個文件。那麼不要設置CURLOPT_COOKIEJAR,這是一個竅門。這將防止文件被寫入,但Cookie將保留在內存中。我只是測試了這一點,它的工作原理(我的測試:將http身份驗證數據發送到一個URL,該URL將您重定向到一個登錄URL,用於驗證請求,然後通過cookie將您重定向回原始URL)。

+1

輝煌,這正是我所期待的。我將'CURLOPT_COOKIEFILE'設置爲'null',並且避免設置'CURLOPT_COOKIEJAR'選項,它工作正常! – silkfire 2014-11-02 18:45:38

相關問題