문제

웹 사이트는입니다 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를 읽으려고 시도하고 그런 문장을 수행하려고하는 것을 보았지만, 나는 그것을 작동시킬 수 없었습니다.

도움이 되었습니까?

해결책

일이 잘되지 않으면 12 초 동안 기다리지 않으려면 몇 가지 옵션을 더 설정할 수 있습니다 (참조 curl_setopt) :

  • CURLOPT_CONNECTTIMEOUT : 연결을 시도하는 동안 기다리는 몇 초. 0을 사용하여 무기한 기다리십시오.
    • 몇 초로 설정하면 충분합니다.
  • CURLOPT_TIMEOUT : 컬 기능이 실행될 수 있도록 최대 초의 수.
    • 이것에 대해서도 동일합니다
  • CURLOPT_DNS_CACHE_TIMEOUT : DNS 항목을 메모리에 유지하는 데 몇 초가 걸립니다. 이 옵션은 기본적으로 120 (2 분)로 설정됩니다.
    • 아마도 이것을 더 높은 값으로 설정할 수 있습니다

귀하의 웹 사이트 사용자가 일반적으로 하나 또는 두 페이지 이상의 페이지를 유지하는 경우 해당 정보를 저장하는 것이 흥미로울 수 있습니다. $_SESSION, 그리고 가끔만 가져 오십시오.

예를 들어, 세션에 저장된 가치가 5 분 전에 가져온 경우에만 가져올 수 있습니다. 아마 몇 번의 전화를 저장할 것입니다 :-)


다른 방법은 클라이언트 측에서 그렇게하는 것입니다.

  • 이미지를 가져와 <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"이벤트가 해고됩니다.

이제 다음과 같은 두 가지 사례를 처리해야합니다.

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

만약에 status ~이다 1, 우리는 "온라인"을 표시하고, 다른 경우 ( "오류"), "오프라인":-)을 표시합니다.

하지만 심지어 작동하는 것 같아요. 그 해결책이 마음에 들지 않아요 ^^

다른 팁

Pascal에서 +1이지만 PHP에서 이것을 원하고 여전히 관심이있는 사람에게는 헤더 위치를 처리하는 작은 스크립트를 만들었습니다 (오프라인/온라인 또는 URL 끝에 넣은 모든 것을 반환합니다. 예를 들어, on_url = 1, 헤더의 위치는 위치를 반환합니다 : 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