LoginSignup
6
6

More than 5 years have passed since last update.

curlリソースに任意の文字列を保存する

Posted at

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) {
    //...
  }
}

ラッピングするとある程度のコストはかかるから、リソース型を直接使って、カリカリにチューニングしたいとき(並列数をすごく多くしたいとか)には、使えるかな?

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6