2012-05-07 9 views
1

fsockopenを使用してゲームサーバーと通信しようとしています。これはいくつかの基本的な統計情報で応答します。これは、サーバーがオンラインのときには完全に動作しますが、サーバーがオフラインの場合、次のコードはPHPがデータを読み取るページの表示を停止させます。PHP5のfsockopen接続エラーのブレークサイト(キャプチャ方法に関係なく)

try { 
     $socket = fsockopen($host, $port, $errno, $errstr, 10); 
     if ($socket !== false) { 
       fwrite($socket, "\xFE"); 
       $data = ""; 
       $data = fread($socket, 1024); 
       fclose($socket); 
       if ($data !== false && substr($data, 0, 1) == "\xFF") { 
         // get into 
       } else { 
         // Server did not send back proper data, or reading from socket failed. 
         print "Server not available."; 
       } 
     } else { 
      // ... 
     } 
} catch(Exception $e){ 
     // ... 
} 

私はtry/catchを試しましたが、私は例外にカスタムハンドラを追加しようとしました。私の唯一のアイデアは、Web要求の外部でこれを実行し、Web要求がそれを開始しないように応答を保存することです。

どのような考えですか?これは、10秒間のタイムアウトが動作されていることを確認することです

echo date("Y-m-d H:i:s")."Before open\n"; 
$socket = fsockopen($host, $port, $errno, $errstr, 10); 
echo date("Y-m-d H:i:s")."After open (socket=".($socket===false?"Bad":"OK")."\n"; 

+0

代わりにCURLを使用してください。それははるかに信頼性が高く、タイムアウトを設定することができます。 –

+0

私はしばらくの間、多くのカールの仕事をする必要はありませんでした。ちょうどデータを取得するだけでなく、これをカールに変えるためにいくつかの仕事をしなければなりません。 – helion3

+0

特に、スクリプトを殺すものは何ですか?そのコードに致命的なエラーがあってはいけません。 – goat

答えて

2

まず、私は、fsockopenの呼び出しのいずれかの側にエコーコマンドのカップルを追加したいです。 2番目のメッセージが表示されない場合、タイムアウトは機能しておらず、問題はもっと不明です。あなたは有効な$ソケットを取得しているが、ロックアップが後で発生した場合とにかく

、その後、試してみてください。

if ($socket !== false) { 
    stream_set_timeout($socket,2); //2 second timeout 
    stream_set_blocking($socket,false); //no blocking 
    fwrite($socket, "\xFE"); 
    ... 

P.S.をこれらの2つのコマンドを追加することで問題が解決したら、そのうち1つが問題を解決するかどうかを試してみてください。それは本当の問題が何であるかを大きな手がかりにするでしょう。

0

html世代の外部でロジックを動かすことで効果があるようです。ルックアップはhtmlがレンダリングされる前に行われるため、失敗した場合はhtml出力が中断されません。

関連する問題