2009-07-31 17 views
6

Trang web này là http://www.ipalaces.org/support/javascript hoặc tùy chọn PHP để phát hiện tình trạng AIM

Mã tôi sử dụng cho các chỉ số trạng thái là

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

đó là một điều gọn gàng mà big.oscar.aol.com cho phép bạn do đó, nó chuyển hướng nó đến bất kỳ hình ảnh nào bạn đã đặt cho on_url nếu chúng trực tuyến và tương tự cho off_url để ngoại tuyến. Tuy nhiên, tôi muốn sử dụng điều này trong một tuyên bố if trong PHP hoặc javascript để hiển thị những thứ khác nhau. Hiện tại tôi đang sử dụng:

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"; } 

Vấn đề với mã này là vì lý do nào đó, vào thời điểm ngẫu nhiên có thể mất đến 12 giây để thực sự truy xuất kết quả. Trong khi tiêu chuẩn img lừa là gần như ngay lập tức.

Có vấn đề gì với curl không? Có cách nào nhanh hơn không?

Tôi đã thấy ai đó cố gắng đọc .src của thẻ img và thực hiện câu lệnh if như thế, nhưng tôi không thể làm cho nó hoạt động.

Trả lời

4

Để tránh chờ đợi một chục giây khi mọi thứ không làm OK, bạn có thể thiết lập tùy chọn một vài chi tiết, như (xem curl_setopt):

  • CURLOPT_CONNECTTIMEOUT: Số giây để chờ đợi trong khi cố gắng kết nối . Sử dụng 0 để chờ vô thời hạn.
    • đặt nó vào một vài giây sẽ đủ
  • CURLOPT_TIMEOUT: Số lượng tối đa của giây để cho phép chức năng cURL để thực thi.
    • cùng cho điều này một
  • CURLOPT_DNS_CACHE_TIMEOUT: Số giây để giữ mục DNS trong bộ nhớ. Tùy chọn này được đặt thành 120 (2 phút) theo mặc định.
    • Bạn có thể thiết lập này cho một giá trị cao hơn

Nếu người dùng của trang web của bạn nói chung ở trên nó hơn chỉ có một hoặc hai trang, nó có thể là thú vị để lưu trữ thông tin trong $_SESSION và chỉ tìm nạp lại một lần trong một thời gian. Ví dụ:

Ví dụ: bạn có thể tìm nạp chỉ khi giá trị được lưu trữ trong phiên đã được tìm nạp hơn 5 phút trước.Nó có lẽ sẽ tiết kiệm một vài cuộc gọi :-)


Một cách khác có thể làm điều đó trên client-side:

  • lấy hình ảnh với thẻ <img>
  • trong trường hợp "trực tuyến", hãy sử dụng hình ảnh tải OK
    • cắm bộ xử lý trên "load" ngay cả hình ảnh, để thay thế bằng một số văn bản
  • trong trường hợp "ngoại tuyến", sử dụng một hình ảnh mà là trong 404
    • cắm một handler vào "error" ngay cả trong những hình ảnh, để thay thế nó với một số văn bản

đó không phải là rất tốt đẹp (loại của nó của "hacky", trong một cách sai lầm), nhưng nó phải làm việc ;-)

hình ảnh của bạn sẽ như thế này:

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

Bạn thấy rằng, nếu người dùng được kết nối, <img> cuối cùng sẽ dẫn đến hình ảnh tồn tại; vì vậy, "load" thậm chí sẽ được kích hoạt.

Và, trong trường hợp người dùng không được kết nối, <img> cuối cùng sẽ dẫn đến một hình ảnh không tồn tại (nó đưa ra lỗi 404); do đó, sự kiện "error" sẽ được kích hoạt.

Bây giờ bạn có để chăm sóc hai trường hợp, với một cái gì đó như thế này:

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

Nếu status1, chúng tôi hiển thị "trực tuyến", và, trong trường hợp khác ("lỗi"), chúng tôi hiển thị "offline" :-)

nhưng, thậm chí là có vẻ như được làm việc, tôi không thực sự thích rằng giải pháp ^^

1

1 đến Pascal cho rằng, nhưng đối với những ai muốn này trong PHP, và vẫn còn quan tâm, tôi đã thực hiện một kịch bản nhỏ mà xử lý các hea der location (trả về ngoại tuyến/trực tuyến hoặc bất kỳ thứ gì bạn đặt ở cuối URL (Ví dụ: on_url = 1, trong tiêu đề sẽ trả về Vị trí: 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.'; 
} 
?> 
Các vấn đề liên quan