6

该网站是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 并执行类似的 if 语句,但我无法让它工作。

4

2 回答 2

4

为了避免在事情不正常时等待十几秒钟,您可以设置更多选项,例如(参见curl_setopt):

  • CURLOPT_CONNECTTIMEOUT:尝试连接时等待的秒数。使用 0 无限期等待。
    • 将其设置为几秒钟就足够了
  • CURLOPT_TIMEOUT: 允许 cURL 函数执行的最大秒数。
    • 这个也一样
  • CURLOPT_DNS_CACHE_TIMEOUT:将 DNS 条目保留在内存中的秒数。此选项默认设置为 120(2 分钟)。
    • 您可能可以将其设置为更高的值

如果您网站的用户通常只停留在一两个页面以上,那么将这些信息存储在 中可能会很有趣$_SESSION,并且只偶尔获取一次。

例如,只有当 session 中存储的值在 5 分钟前被提取时,您才可以提取它。它可能会节省几个电话:-)


另一种方法可能是在客户端执行此操作:

  • 获取带有<img>标签的图像
  • 如果是“在线”,请使用加载正常的图像
    • 在图像的“”上插入一个处理程序,load用一些文本替换它
  • 如果是“离线”,请使用 404 中的图像
    • 在图像的“”上插入一个处理程序,error用一些文本替换它

这不是很好(它有点“hacky”,以错误的方式),但它应该工作;-)

你的形象会是这样的:

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

如果status1,我们显示“在线”,在其他情况下(“错误”),我们显示“离线”:-)

但是,即使它似乎有效,我也不是很喜欢那个解决方案^^

于 2009-07-31T17:36:03.090 回答
1

为此向 Pascal +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.';
}
?>
于 2013-11-10T04:13:18.620 回答