libcurlの機能なんだろうけど、PHPからでも使えた。
PHPマニュアルには反映されていないが、curl_setopt()
で使えるオプションの一つにCURLOPT_PRIVATE
なるものがある。
これはcurlリソースに任意の文字列を保存できるという機能らしい。
$ch1 = curl_init();
$ch2 = curl_init();
curl_setopt($ch1, CURLOPT_PRIVATE, 'abcd');
curl_setopt($ch2, CURLOPT_PRIVATE, 'wxyz');
var_dump(curl_getinfo($ch1, CURLINFO_PRIVATE));
var_dump(curl_getinfo($ch2, CURLINFO_PRIVATE));
ちゃんとch1にはabcdが、ch2にはwxyzが格納されていて、区別されている。
格納した文字列はリクエスト自体には何ら影響を与えず、単なる付加情報として利用者が好き勝手に使ってよいということらしい。
curl_setopt
(もしくはcurl_setopt_array
)で格納し、curl_getinfo
で第二引数をCURLINFO_PRIVATE
にすることで取り出せる。
curl_getinfo
の第二引数を省略して連想配列で一気に取得することはできないので注意。
libcurlの方だと保存できるのはvoid*
型らしいのでなんでもいいんじゃないかと思うが、PHP版では文字列しか保存できないようだ。
文字列しか保存できない、、ということで微妙なのだが、複数のリソース型変数をいくつも扱いたい時、綺麗に管理するのが意外と面倒くさいので、何かの役に立つことはあるかも。
まあ、「こういう感じのクラスに普通ラッピングするよね、なんでそんな微妙な機能が必要なの」とも思うんだけど、、、
class CurlRequest {
private $ch;
function __construct($url) {
$this->ch = curl_init($url);
}
function __destruct() {
curl_close($this->ch);
}
//...
/**
* 追加属性情報を保持させる
*/
function setInfo($name, $value) {
//...
}
function getInfo($name) {
//...
}
}
ラッピングするとある程度のコストはかかるから、リソース型を直接使って、カリカリにチューニングしたいとき(並列数をすごく多くしたいとか)には、使えるかな?