Опция JavaScript или PHP для определения статуса AIM
Веб-сайт 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 для офлайна. Тем не менее, я хочу использовать это в операторе if в PHP или javascript для отображения разных вещей. В настоящее время я использую это:
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? Есть ли более быстрый способ?
Я видел, как кто-то пытался прочитать.src тега img и сделать подобное утверждение if, но я не смог заставить его работать.
2 ответа
Чтобы избежать ожидания в течение дюжины секунд, когда что-то идет не так, вы можете установить еще пару параметров, например (см. curl_setopt
):
CURLOPT_CONNECTTIMEOUT
: Количество секунд ожидания при попытке подключения. Используйте 0, чтобы ждать бесконечно.- достаточно установить пару секунд
CURLOPT_TIMEOUT
Максимальное количество секунд, в течение которых функции cURL могут выполняться.- то же самое для этого
CURLOPT_DNS_CACHE_TIMEOUT
: Количество секунд для хранения записей DNS в памяти. Эта опция по умолчанию установлена на 120 (2 минуты).- Вы могли бы вероятно установить это в более высокое значение
Если пользователи вашего веб-сайта обычно используют более одной или двух страниц, может быть интересно сохранить эту информацию в $_SESSION
и только получить его время от времени.
Например, вы можете получить его, только если значение, сохраненное в сеансе, было выбрано более 5 минут назад. Это, вероятно, сэкономит пару звонков :-)
Другим способом может быть сделать это на стороне клиента:
- получить изображение с
<img>
тег - в случае "онлайн", используйте изображение, которое загружается ОК
- подключить обработчик
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
мы показываем "Online", а в другом случае ("error") мы показываем "Offline":-)
Но даже если это работает, мне не очень нравится это решение ^^
+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.';
}
?>