Go for it!

モーターサイクルと自転車とキャンプの日々。

PHPでネットワークストリーム(ソケット?)を扱う話

いろんな関数からネットワークストリーム(ソケット?)が扱えます。

何が違うのかよくわからないものもありますが、少なくとも以下の関数がある。

お仕事で開発している某システムのバッチでは、コネクションタイムアウトとレスポンスタイムアウトを別々に扱いたかったので調べてみたところ、fsockopen()を使うとコネクションタイムアウトを取り扱えることがわかった。他の関数ではレスポンスタイムアウトは設定可能なものの、コネクションタイムアウトの設定は行えない。

こんな風に使う。

[code lang=‘php’] // parse url $array = parse_url($url);

$host    = $array['host'];
$address = gethostbyname($array['host']);
$port    = (!is_null($array['port'])) ? $array['port'] : 80;
$path    = (!is_null($array['path'])) ? $array['path'] : '/';


// connect to host
do {
  $fp = @fsockopen($host, $port, $err, $errmsg, 5);
  // 接続したらループを抜ける
  if ($fp) break;

  // 接続できなかったら…
  // ループカウンタをインクリメント
  $lp_count++;

  // 1秒待ってリトライ&
  sleep (1);
} while ($lp_count < $max_try_count);

[/code]

socket_*の関数群ではもっと低レイヤの作業が出来そうだけど、fsockopenだとfgets/fputsなどの比較的上位の関数しか使えないようだ。

しかし、PHPはいろんな関数が揃っていて便利だなあ(キモイけど)。

[ad#text_wide]