34

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

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

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

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

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

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

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

4

6 に答える 6

27

残念ながら、入力ストリームと出力ストリームとして「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番目のリクエストで。

于 2009-09-28T11:03:09.140 に答える
26

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

于 2009-09-29T03:46:27.633 に答える
12

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

于 2011-04-22T18:05:31.670 に答える
3

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

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

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

于 2017-10-16T10:12:16.523 に答える
2

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

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

于 2009-09-28T09:13:35.913 に答える
0

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

curl_setopt($ch, CURLOPT_HEADER, 1);

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

于 2014-01-31T18:34:37.977 に答える