목표 상태를 감지하기위한 JavaScript 또는 PHP 옵션
-
06-07-2019 - |
문제
웹 사이트는입니다 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&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.';
}
?>