言語: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)でクローズする事しか考えられていません。
宜しくお願い致します。
実運用とおっしゃっているのがどの程度の規模や頻度を想定しているか分かりませんが php のタイムアウトでスレッドが強制終了されるということは fclose($fp); が実行されずソケットが開きっぱなしになります。
(正確にはソケットのタイムアウトまで接続しっぱなし)
つまり相手サーバの接続をひとつずつ食いつぶしていきます。
ポートが443ということはHTTPSでの通信だと思いますがレスポンスヘッダからサイズを取ってカウントするか、レスポンスの最後に現われるであろう、例えば </html> のような目印を見つけてループを break するほうが良いと思います。
ご教示頂きまして有難うございます。
2014/01/07 20:21:15phpのタイムアウトの場合は、ソケットが開きっぱなしになってしまうんですね。それ用の対策が必要になってくるんですね。
有難うございます。とても参考になりました。