| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

25-02-2011, 15:05
|
|
baerenwurm
Registrierter Benutzer
|
|
Registriert seit: Oct 2001
Beiträge: 87
|
|
cURL Timeout beim Abfragen von Messenger-Online-Status scheint nicht zu funktionieren
Hi.
Hab folgendes Script für die Benutzerprofile meines Forums laufen. Es überprüft den Online Status von ICQ, YIM, AIM, WLM und Skype. Der Timeout (250ms pro URL) ist insbesondere dank des lahmen ICQ-Servers recht wichtig. Aber irgendwie scheint dieser nicht zu greifen: Manche Profile brauchen Minuten, bis sie geladen sind.
Für eine paar Tipps wär ich euch sehr dankbar!
[ edit, siehe Post #3 ]
PHP-Code:
function aimyim_status($id,$host) { if ($id === '') return;
switch ($host) { case 'yahoo': $url = 'http://opi.yahoo.com/online?u='.$id.'&m=a&t=1'; break; case 'aim': $url = 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false'; break; case 'icq': $url = 'http://status.icq.com/online.gif?icq='.$id; break; case 'msn': $url = 'http://messenger.services.live.com/users/'.$id.'/presence'; break; case 'skype': $url = 'http://mystatus.skype.com/'.$id.'.num'; break; default: return; // unknown host }
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 100); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 250); curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 5); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); $result = trim(curl_exec($ch));
if ($result == '') return 'unknown';
switch ($host) { case 'yahoo': $online = $result != '00'; break; case 'aim': $online = stripos($result, 'true'); break; case 'icq': $online = stripos($result, 'online1'); break; case 'msn': $online = stripos($result, 'offline') === false; break; case 'skype': $online = intval($result) == 1; break; }
return $online ? 'online' : 'offline'; }
Geändert von baerenwurm (25-02-2011 um 15:52 Uhr)
|

25-02-2011, 15:29
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
du solltest zuerst herausfinden, welcher Request am längsten dauert und dann ermitteln, ob die Verbindungszeit, die Antwortzeit oder die Übertragungsrate das Problem ist. Dein Code ist übrigens hochgradig wiederholend. Schreib doch besser eine Funktion dafür.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

25-02-2011, 15:34
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Wenn wir das erstmal refaktorieren, wird es deutlich kürzer und deine Chancen steigen, dass es sich jemand durchliest.
PHP-Code:
function aimyim_status($id,$host) { if ($id === '') return;
switch ($host) { case 'yahoo': $url = 'http://opi.yahoo.com/online?u='.$id.'&m=a&t=1'; break; case 'aim': $url = 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false'; break; case 'icq': $url = 'http://status.icq.com/online.gif?icq='.$id; break; case 'msn': $url = 'http://messenger.services.live.com/users/'.$id.'/presence'; break; case 'skype': $url = 'http://mystatus.skype.com/'.$id.'.num'; break; default: return; // unknown host }
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 100); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 250); curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 5); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $result = trim(curl_exec($ch));
if ($result == '') return 'unknown';
switch ($host) { case 'yahoo': $online = $result == '00'; break; case 'aim': $online = stripos($result, 'true'); break; case 'icq': $online = stripos($result, 'online1'); break; case 'msn': $online = stripos($result, 'offline') === false; break; case 'skype': $online = intval($result) == 1; break; }
return $online ? 'online' : 'offline'; }
Geändert von onemorenerd (25-02-2011 um 15:37 Uhr)
|

25-02-2011, 15:35
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Wow, der Code (#1) wurde wohl mit einer Guttenberg-Tastatur geschrieben.
|

25-02-2011, 15:35
|
|
baerenwurm
Registrierter Benutzer
|
|
Registriert seit: Oct 2001
Beiträge: 87
|
|
Zitat:
Zitat von AmicaNoctis
Hallo,
du solltest zuerst herausfinden, welcher Request am längsten dauert und dann ermitteln, ob die Verbindungszeit, die Antwortzeit oder die Übertragungsrate das Problem ist.
|
Ok, danke.
Zitat:
|
Dein Code ist übrigens hochgradig wiederholend
|
Aber abgesehen davon müsste doch eigentlich passen, oder?
Zitat:
Zitat von h3ll
Wow, der Code wurde wohl mit einer Guttenberg-Tastatur geschrieben.
|
Haha, in der Tat (halb).
Zitat:
Zitat von onemorenerd
Wenn wir das erstmal refaktorieren, wird es deutlich kürzer und deine Chancen steigen, dass es sich jemand durchliest. 
|
Danke!
|

25-02-2011, 17:46
|
|
baerenwurm
Registrierter Benutzer
|
|
Registriert seit: Oct 2001
Beiträge: 87
|
|
Zitat:
Zitat von onemorenerd
Wenn wir das erstmal refaktorieren, wird es deutlich kürzer und deine Chancen steigen, dass es sich jemand durchliest. 
|
Danke nochmal. Aber sollte ich nicht "curl_close($ch);" nach "$result = trim(curl_exec($ch));" reinschreiben!? Und beim AIM-Check brauch ich halt zudem den Header in der Ausgabe.
Also so?
PHP-Code:
if ($url == 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false') { curl_setopt($ch, CURLOPT_HEADER, 1); } else { curl_setopt($ch, CURLOPT_HEADER, 0); }
[e] Der 250ms-Timeout gilt für die jeweilige URL, nicht für die gesamte Funktion, oder!?
[e2] Stimmt das jetzt so?  Der Status wird nun jedenfalls korrekt angezeigt und die Profile recht fix aufgerufen.
PHP-Code:
function aimyim_status($id,$host) { if ($id === '') return;
(...)
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 100); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 250); curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 5); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($url == 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false') { curl_setopt($ch, CURLOPT_HEADER, 1); } else { curl_setopt($ch, CURLOPT_HEADER, 0); } $result = trim(curl_exec($ch)); if ($result == '') { return 'unknown'; } curl_close($ch);
switch ($host) { case 'yahoo': $online = intval($result) != 00; break; case 'aim': $online = stripos($result, 'true'); break; case 'icq': $online = stripos($result, 'online1'); break; case 'msn': $online = stripos($result, 'online'); break; case 'skype': $online = intval($result) != 1; break; }
return $online ? 'online' : 'offline'; }
Geändert von baerenwurm (25-02-2011 um 19:25 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|