ソケット通信(送信側)について質問させて下さい。


言語:PHP5.3
OS:CentOS5

現在、ソケット通信をfsockopenを使用して実装しようとしています。
fputsで送信後、レスポンスはwhile(!feof($fp))でまわして、fgetsで取得する形になります。
▼下記のようになります。

$fp = fsockopen("ssl://".$hostname, 443);
$request = "ヘッダとボディのリクエスト情報作成";
if(!$fp){
fclose($fp);
}else{
fputs($fp, $request);
while(!feof($fp)){
$getdata .= fgets($fp);
}
}
fclose($fp);

ネットとかで調べると、while(!feof($fp))部分で、trueが返ってこない場合があるので、無限ループに陥る可能性があると書かれていました。
もし、何かしらの原因で無限ループになってもphp.iniで設定している
デフォルトタイムアウト(30秒)で30秒経つと強制終了されるので、良いと思っているのですが、実運用で使用する考えた場合、上記のコードでは足りず、何か他に考慮しなければいけない事はありますでしょうか?
現状、タイムアウトはphp.iniのデフォルトタイムアウトに任せて、何か失敗したら、
fclose($fp)でクローズする事しか考えられていません。
宜しくお願い致します。







































回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/12/31 08:49:47
  • 終了:2014/01/07 08:50:04

ベストアンサー

id:gizmo5 No.1

gizmo5回答回数484ベストアンサー獲得回数1382014/01/06 12:06:10

ポイント500pt

実運用とおっしゃっているのがどの程度の規模や頻度を想定しているか分かりませんが php のタイムアウトでスレッドが強制終了されるということは fclose($fp); が実行されずソケットが開きっぱなしになります。
(正確にはソケットのタイムアウトまで接続しっぱなし)
つまり相手サーバの接続をひとつずつ食いつぶしていきます。

ポートが443ということはHTTPSでの通信だと思いますがレスポンスヘッダからサイズを取ってカウントするか、レスポンスの最後に現われるであろう、例えば </html> のような目印を見つけてループを break するほうが良いと思います。

id:akihiko0826

ご教示頂きまして有難うございます。
phpのタイムアウトの場合は、ソケットが開きっぱなしになってしまうんですね。それ用の対策が必要になってくるんですね。
有難うございます。とても参考になりました。

2014/01/07 20:21:15

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません