2011-11-08 7 views
2

私たちの顧客の一人は、fsockopen()を使ってサーバがオンラインであるかどうかを判断する非常に単純なスクリプトを持っていると言いました。彼らは最近まで私たちを通してウェブサイト上で正常に機能していたと言いましたが、最近は機能しなくなったので、それが設定だと仮定しています。特定のWebホストでfsockopen()が動作していませんか?

私が最初に思ったのは、彼がTCPとして使用していて、IP /ポートをゲームサーバーに使用していたということでしたが、彼と私はどちらもスクリプトが他のさまざまなWebホストからうまく機能していることを確認しました。

特に私たちの問題は何か?

作品:http://crazygfl.xfactorservers.com/query.php?ip=www.xfactorservers.com&port=80

作品:http://crazygfl-stats.com/query.php?ip=109.73.163.231&port=27015

が動作しない:ここではhttp://crazygfl.xfactorservers.com/query.php?ip=109.73.163.231&port=27015

はコードです...

<?php 

    $timeout = (isset($_GET['timeout']) ? ($_GET['timeout'] <= 0 ? 30 : ((int)$_GET['timeout'])) : 30); 

    if(empty($_GET['ip'])&&empty($_GET['port'])){ 
     echo 'No IP/Port specified.'; 
    }else{ 
     if(fsockopen($_GET['ip'], $_GET['port'], $errno, $errstr, $timeout) === false){ 
      echo 'offline'; 
     }else{ 
      echo 'online'; 
     } 
    } 
+0

fsockopen機能が無効になっていないことを確認してください。 –

+0

はスマートであり、精通した人物がホストからの要求をブロックしている(他のIP上であると仮定して)他のホストとは要求をブロックしている可能性があります。それは矛盾した行動を説明するでしょう – sdolgy

+0

"作品"/"動作しません"とは何を意味するのですか?出力はありませんか?それはタイムアウトですか? – symcbean

答えて

4

これは、ホスティング会社が無効になっていることが可能ですfsockopen関数またはファイアウォールされたアウトバウンド要求を、テストしようとしているどのポートでも使用できます。そうであれば、それらの機能を有効にするかポートのブロックを解除するように頼むことができますが、そうでなければ、新しいホストに移動する以外の方法はありません。

ところで、ユーザー入力($ _GET、$ _POSTなど)から直接データを使用して検証することなく、非常に悪い考えがあります。

+0

実際にはWEがホストです。しかし、Webホスティングは、付加的なインセンティブとしてお客様に無料で提供するサイドサービスです。残念ながら、私たちのウェブマスターは最高の英語を話さないので、彼と一緒にそれを整理しようとするよりもむしろ解決策で彼に近づければよい。 スクリプトは私たちのホスティングの他のポートと連携するので、私は後者に向かっています。機能していないポートは、特にファイアウォールを解除する必要がありますか? –

+0

@Brett Powell:そうですね、crazy---.-torservers.comのスクリプトがゲームサーバーに接続できないような特定のルールがあるようです。ウェブサーバーのアドレスとポート番号(例:ip = www.heise.de&port = 80)を入力すると問題なく動作します。おそらく標準的なポート(http、ftp、ssh、...)はファイアウォールで許可されているだけで、1024以下のポートだけでも構いません。 – VolkerK

+0

大丈夫、ありがとう! –

3

上記の3つのホストは、同じマシン上にありますか、別々のマシンにありますか?それらの間の構成が一貫していない可能性があります。 「すぐにわかる」が有効になっているかどうかを確認します。

<?php 
if(function_exists('fsockopen')) { 
     echo "fsockopen function is enabled"; 
} 
else { 
     echo "fsockopen is not enabled"; 
} 
?> 

を、それが有効になっている場合は、ファイアウォールのルールが成功しなかったホストをブロックしているかどうかを確認します。

失敗すると、スクリプトをcURLベースの実装:http://ch.php.net/curlに移行し、問題の解決に役立つかどうか確認してください。

+0

優秀、ありがとうございます。 libcurlのアプローチではこのような作業をしてはいけませんか? http://pastie.org/2829896ゲームサーバーのポートを使っていますが、まだオフラインで表示されているので、ファイアウォールが無効になっていると思いますが、マシンをチェックします。 –