6

Web サイトはhttp://www.ipalaces.org/support/です。

ステータスインジケーターに使用するコードは

<img src="http://big.oscar.aol.com/imperialpalaces?on_url=http://www.ipalaces.org/support/widget/status_green.gif&off_url=http://www.ipalaces.org/support/widget/status_offline.gif">

これは、big.oscar.aol.com で実行できる優れた機能です。オンラインの場合は on_url に設定した画像にリダイレクトし、オフラインの場合は off_url に同じようにリダイレクトします。ただし、これを PHP または JavaScript の if ステートメントで使用して、さまざまなものを表示したいと考えています。現在、私はこれを使用しています:

function getaim($screenname) {
        $ch     = curl_init();
        $url    = "http://big.oscar.aol.com/$screenname?on_url=true&off_url=false";
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        // added to fix php 5.1.6 issue:
        curl_setopt($ch, CURLOPT_HEADER, 1);
        $result = curl_exec($ch);
        curl_close($ch);

        if(eregi("true",$result)) {
            return true;
        } else {
            return false;
        }
}

If (getaim("ImperialPalaces")) { print "Online"; } else { print "Offline"; }

このコードの問題は、なんらかの理由で、実際に結果を取得するのに最大 12 秒かかる場合があることです。一方、標準の img トリックはほぼ瞬時に実行されます。

curl に関する既知の問題はありますか? もっと速い方法はありますか?

誰かが img タグの .src を読み取ってそのような if ステートメントを実行しようとしているのを見たことがありますが、私はそれを機能させることができませんでした。

4

2 に答える 2

4

物事がうまくいかないときに数十秒待つのを避けるために、 ( を参照curl_setopt)のようないくつかのオプションを設定できます。

  • CURLOPT_CONNECTTIMEOUT: 接続試行中に待機する秒数。無期限に待機するには、0 を使用します。
    • 数秒に設定するだけで十分です
  • CURLOPT_TIMEOUT: cURL 関数の実行を許可する最大秒数。
    • これも同じ
  • CURLOPT_DNS_CACHE_TIMEOUT: DNS エントリをメモリに保持する秒数。このオプションは、デフォルトで 120 (2 分) に設定されています。
    • おそらくこれをより高い値に設定できます

Web サイトのユーザーが一般的に 1 ページまたは 2 ページ以上その Web サイトにとどまる場合、その情報を に保存し$_SESSION、時々取得するだけにすると面白いかもしれません。

たとえば、セッションに保存されている値が 5 分以上前に取得された場合にのみ取得できます。それはおそらく数回の呼び出しを節約するでしょう:-)


もう1つの方法は、クライアント側でそれを行うことです:

  • <img>タグで画像を取得する
  • 「オンライン」の場合は読み込みOKの画像を使用
    • 画像の " " イベントにハンドラーをプラグインして、loadテキストに置き換えます
  • 「オフライン」の場合は404にある画像を使用
    • 画像の " " イベントにハンドラーをプラグインして、errorテキストに置き換えます

それはあまりいいことではありません (間違った方法で「ハック」のようなものです) が、うまくいくはずです ;-)

あなたのイメージは次のようになります:

<div id="arround-1">
    <img id="img-1" src="http://big.oscar.aol.com/imperialpalaces?on_url=http://www.ipalaces.org/support/widget/status_green.gif&amp;off_url=http://this.is-a-404-error.com"
        onload="replace_img_status(1, 1);"
        onerror="replace_img_status(1, 0);"
    />
</div>

ユーザーが接続されている場合、<img>最終的に存在する画像につながることがわかります。そのため、" load" も起動されます。

また、ユーザーが接続されていない場合は、<img>最終的に存在しない画像が表示されます(404 エラーが発生します)。そのため、" error" イベントが発生します。

次のようなもので、これら2つのケースに対処する必要があります。

<script type="text/javascript">
    var replace_img_status = function (num, status) {
        var div = document.getElementById('arround-' + num);
        if (div) {
            if (status == 1) {
                div.innerHTML = 'Online';
            } else {
                div.innerHTML = 'Offline';
            }
        }
    };
</script>

の場合status1「オンライン」と表示し、それ以外の場合 (「エラー」) は「オフライン」と表示します:-)

しかし、それが機能しているように見えても、私はその解決策があまり好きではありません^^

于 2009-07-31T17:36:03.090 に答える