人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

言語: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)でクローズする事しか考えられていません。
宜しくお願い致します。









































●質問者: akihiko0826
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● gizmo5
●500ポイント ベストアンサー

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

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


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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ