質問

ウェブサイトは 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ステートメントを実行しようとするのを見たことがありますが、動作させることができませんでした。

役に立ちましたか?

解決

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

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

ウェブサイトのユーザーが通常1ページまたは2ページ以上しかアクセスしない場合、その情報を$_SESSIONに保存し、たまに一度だけ取得するのは興味深いかもしれません。

たとえば、セッションに保存された値が5分以上前に取得された場合にのみ取得できます。おそらく、:-)

の呼び出しを数回保存します

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

  • <img>タグで画像を取得
  • <!> quot; online <!> quot;の場合、OKを読み込む画像を使用します
    • <!> quot; load <!> quot;のハンドラを接続します。画像であっても、テキストに置き換えます
  • <!> quot; offline <!> quot;の場合、404にある画像を使用します
    • <!> quot; error <!> quot;のハンドラを接続します。画像であっても、テキストに置き換えます

それはあまり良いことではありませんが(<!> quot; hacky <!> quot;のようなものですが、間違った方法で)、動作するはずです;-)

あなたの画像は次のようになります:

<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>

ユーザーが接続されている場合、statusが最終的に存在する画像につながることがわかります。したがって、<!> quot; 1 <!> quot;でも解雇されます。

そして、ユーザーが接続されていない場合、<=>は最終的に存在しない画像になります(404エラーを返します);したがって、<!> quot; <=> <!> quot;イベントが発生します。

次のようにして、これら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>

<=>が<=>の場合、<!> quot; Online <!> quot;を表示し、他の場合(<!> quot; error <!> quot;)には<! > quot;オフライン<!> quot; :-)

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

他のヒント

そのためにPascalに

+1しますが、PHPでこれを望み、まだ興味がある人のために、ヘッダーの場所を処理する小さなスクリプトを作成しました(オフライン/オンライン、またはURL(たとえば、ヘッダーのon_url = 1、Location:1を返します)

<?php
Define('Username', $_GET['sn']);
Define('URL', 'http://big.oscar.aol.com/' . Username . '?on_url=online&off_url=offline');
Define('Online', 'Location: online'); // Change online to whatever you have for on_url
Define('Offline', 'Location: offline'); // Change offline to whatever you have for off_url

$Response = Get_Headers(URL);

If(In_Array(Online, $Response)){
    Echo UCWords(StrToLower(Username)) . ' is currently online.';
}
ElseIf(In_Array(Offline, $Response)){
    Echo UCWords(StrToLower(Username)) . ' is currently offline, or has set their privacy settings.';
}
?>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top