web-dev-qa-db-ja.com

curlのCookieをディスクではなくメモリに保持する方法

私はphp5.3.0でいくつかのcURL作業を行っています。

カールハンドル/オブジェクトにCookieをメモリに保持するように指示する方法(複数のリクエストに同じハンドルを再利用していると仮定)、または何らかの方法でそれらを返して、Cookieを作成するときに返す方法があるかどうか疑問に思っています新しいハンドル。

それらをリクエストに出し入れするためのこの長い間受け入れられている方法があります:

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

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

これらのCookieファイルがディスク上にあるという問題もあります。ディスクI/Oは遅く、ボトルネックは確かです。スクリプトが終了したときにCookieファイルをクリーンアップする必要はありません(クリーンアップできる方法で終了した場合でも)。

何か案は?それとも、これはまさにその通りですか?

33
Uberfuzzy

_CURLOPT_COOKIEJAR_オプションを使用して、ファイルをLinux/MacOS Xの場合は「_/dev/null_」に、Windows)の場合は「NULL」に設定できます。。これにより、Cookieがディスクに書き込まれるのを防ぐことができますが、ハンドルを再利用してcurl_easy_cleanup()を呼び出さない限り、Cookieはメモリ内に保持されます。

26
Ben Combee

残念ながら、入力ストリームと出力ストリームとして「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'];
}
?>

これにより、「Hello!」が出力されます。 2番目のリクエストで。

27
James Hall

CURLOPT_COOKIEFILEを存在しないファイルに設定するだけです。通常、空の文字列が最適なオプションです。次に、CURLOPT_COOKIEJARを設定しないでください。これがトリックです。これにより、ファイルが書き込まれるのを防ぎますが、Cookieはメモリに残ります。私はこれをテストしましたが、機能します(私のテスト:リクエストを認証するログインURLにリダイレクトするURLにhttp認証データを送信してから、Cookieを使用して元のURLにリダイレクトします)。

9
mynameistechno

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

どういうわけか、CurlのクリーンアップがCookieのリンク解除を処理したと思いましたが、私は間違っている可能性があります。

2
Tim Post

ありますが、それは完全に直感的ではありません。

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

詳細については、コメントの 私の答えを参照してください

2
jgmjgm

私にとってうまくいくのは、この設定を使用することです。

curl_setopt($ch, CURLOPT_HEADER, 1);

そして、結果を解析します。詳細は このブログ投稿 これを行う方法を見つけました。
そしてそれは古いので、ここに 非推奨の関数を置き換える要点 があります。

0
eristoddle