2009-09-28 12 views
30

私はPHP 5.3.0でいくつかのcURL作業をしています。カールのクッキーをディスクではなくメモリに保存する方法

私は、(複数のリクエストに対して同じハンドルを再利用していると仮定して)クッキーハンドル/オブジェクトにCookieを保持するよう指示する方法があるかどうか、あるいは何とかそれらを返して、新しいハンドルを作るときに戻る。

Theresの中で/リクエストのうち、それらを取得するためのこの長い認められた方法:

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

しかし、私は同じディレクトリからスクリプトの複数のコピーを実行している必要があるいくつかのシナリオを打ちますよ、彼らはお互いにクッキーファイルを歩いています。はい、私はtempnam()を使用して、それぞれの実行に独自のCookieファイルがあることを確認できますが、それは私の2番目の問題につながります。

ディスク上にこれらのCookieファイルを作成する問題もあります。ディスクI/Oは遅く、ボトルネックです。私はスクリプトが終了したときにクッキーファイルをクリーンアップすることに対処したいとは思わない(それがクリーンアップできるようにも終了する場合)。

アイデア?それとも、まさにこれが物事の仕方ですか?

+7

を参照してください、私はあなたがネットワークI/Oをやっているとき、I/O、ディスクを心配する必要はないと思います。 – NSSec

答えて

23

あなたはCURLOPT_COOKIEJARオプションを使用すると、WindowsのためのLinux/MacOS Xのまたは "NULL" 用のファイルを "/dev/null" に設定することができます。これにより、クッキーがディスクに書き込まれるのを防ぐことができますが、ハンドルを再利用し、curl_easy_cleanup()を呼び出さない限り、クッキーはメモリ内に保持されます。

+0

したがって、curl_close()が呼び出されるまでクッキーは有効でしょうか?あなたはこれをテストしましたか? –

+14

投稿する前にlibcurlのソースコードを読んで確認します。 –

+2

私はそれを試して、それは動作していないようです。 Windowsでも* nixでも。 –

2

Linuxを使用している場合は、/ dev/shm内のどこかを指すように設定することができます。これによりメモリが確保され、再起動しても永続しないことが保証されます。

私は何とかCurlのクリーンアップがクッキーのリンク解除を処理したと思っていましたが、間違いかもしれません。

+0

実用的な実装を提供できますか? –

25

残念ながら、私はあなたが入力と出力ストリームとして 'php:// memory'を使うことはできないと思います。回避策は、ヘッダーを自分で解析することです。これはかなり簡単に行うことができます。ここでは、2つのリクエストを作成して、自分で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番目のリクエストで

+2

このコードは大変感謝してくれました –

+2

一連のリクエストでクッキーを2回以上解析すると、文字列にクッキーを蓄積しなければならず、古い値を新しいキーで上書きする必要があります。 (そしてクッキージャーの実装に滑りやすい斜面が始まります!) –

8

CURLOPT_COOKIEFILEを存在しないファイルに設定するだけで、通常は空の文字列が最適です。次に、CURLOPT_COOKIEJARを設定しないでください。これはトリックです。これにより、ファイルが書き込まれることはなくなりますが、クッキーはメモリに残ります。私はちょうどこれをテストし、それは動作します(私のテスト:http認証データを、リクエストを認証するログインURLにリダイレクトするURLに送信してから、元のURLにクッキーでリダイレクトします)。

curl_setopt($ch, CURLOPT_HEADER, 1); 

をそして、その結果を解析する:私の作品は何

+1

華麗な、これはまさに私が探していたものでした。私は 'CURLOPT_COOKIEFILE'を' null'に設定し、 'CURLOPT_COOKIEJAR'オプションの設定を控えると、うまくいきました! – silkfire

0

完全に直感的ではありません。

curl_setopt($curl, CURLOPT_COOKIEFILE, ""); 

詳細については正直なところmy answer in the comments

関連する問題