опция JavaScript или PHP для определения статуса AIM - PullRequest
6 голосов
/ 31 июля 2009

Веб-сайт 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 ]

4 голосов
/ 31 июля 2009

Чтобы избежать ожидания в течение дюжины секунд, когда все идет не так, вы можете установить еще пару параметров, например (см. 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 голос
/ 10 ноября 2013

+ 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.';
}
?>
...