Опция 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&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 мы показываем "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.';
}
?>
Другие вопросы по тегам