Hallo Eddi!
Danke das du dir die Mühe gemacht hast!
CURLOPT_UNRESTRICTED_AUTH ist hier völlig falsch. Du sendest keine Authentifizierung. Demzufolge ist CURLOPT_FOLLOWLOCATION Diskussionsgrundlage. Wenn der Server eine Weiterleitung vornimmt, wirst Du es nie erfahren. Dein Script folgt hier stumpf, ohne dass Du dies abfängst. Du solltest, wie weiter unten beschrieben, in der Script-Logik mindestens den HTTP-Status abfangen.
Oh das CURLOPT_UNRESTRICTED_AUTH war noch aus der Zeit als ich eine Authentifizierung brauchte.
Die Authentifizierung selbst hatte ich entfernt aber da diese Zeile keinen Schaden angerichtet hat, hab ich sie wohl übersehen.
Wegen CURLOPT_FOLLOWLOCATION: Weil die Seite wohl eng mit einem Board verknüpft ist bin ich mir sehr sicher (bzw. ich weiß es), dass die Anfrage weiter geleitet wird. Das Problem ist nur, dass ich nicht weiß wie oft.
Im Idealfall nur 1 mal aber ich weiß nicht ob das so bleibt wenn die Software für das Board geupdated wird.
Deshalb dachte ich mir ich folge erstmal "stumpf" bis etwas gefunden wird.
Das war leider(?) so beabsichtigt.
Dieses Script ist kein Mozilla, noch rendert es mit dem Gecko. Zum einen ist dies unnötiger Datentransfer, zum anderen könnte der Server aufgrund des alten Browsers Änderungen des Inhalts veranlassen. Was soll das also?
Ich weiß nicht was für einen String ich senden sollte also habe ich den genommen der bei mir "funktioniert". Das war der, des Browsers.
Sagen wir, die Verbindung unterschreite für länger als vier Sekunden die gesetzte Geschwindigkeitsgrenze. Für diesen Fall trifft folgende Aussage zu:
($content===true)
Prüfe also, ob$content
gefüllt ist.
Mh ich dachte beim überschreiten/unterschreiten wäre $content === false.
Nichts desto trotz hast du recht und ich sollte $content an der Stelle abfragen um die Ausführung des restlichen Teils zu vermeiden.
Dein jetziger Scriptansatz ist nur auf eins gefasst - nähmlich alles geht gut. Davon ist nicht auszugehen. Server können überlastet sein, Admins können sich beim Umkonfigurieren vertippt haben, was zu temporären Ausfällen käme, deren Datenbank schmiert mal schnell ab - und, und, und.
In dem Fall wird auch false zurückgegeben, nur halt erst nachdem die DOM-Funktionen angelaufen sind und das Array am Ende leer ist. Das ist schon umständlich, stimmt.
(...)Dennoch gebe ich zu bedenken, lieber
curl_setopt($ch,CURLOPT_HEADER,true);
zu nutzen und die HTTP-Schicht ebenso zu analysieren. Ein kleines Beispiel, was den Status ermittels:
Das klingt sehr gut. In der Praxis interessiert mich der Status allerdings nicht wirklich. Daher reicht mir vermutlich tatsächlich schon dieser Ansatz von dir:
Im simpelsten Fall reicht hier wirklich folgendes:
if(($content=curl_exec($ch))===false){
return(false);
}
> > @$doc->loadHTML($content);
>
> Mit @ bekommst Du nicht mal mit, wenn es zu oben beschriebenen Verbindungsfehlern kommt und $content `false`{:.language-php} ist.
Ja das habe ich irgendwie nicht verstanden.
Ich krieg "das false" natürlich nur ohne das @, allerdings wirft mir das Script ohne das @ einen Fehler aus. Oder besser eine Warnung.
Wohl weil das Dokument nicht valide aber trotzdem "wohlgeformt" ist. Das ist mal eine unverständliche Beschreibung im PHP-Handbuch :(
Das ist dann wohl auch der Grund warum ich das Ergebnis erst am Ende des Scripts auswerte :/
>
> > $divs = $doc->getElementsByTagName('div');
> > $heroes = array();
> > for($i = 0; $i < $divs->length; ++$i){
> > if($divs->item($i)->getAttribute('class') == 'cache-info'){
> > $bold = $divs->item($i)->getElementsByTagName('b');
> > for($a = 0; $a < $bold->length; ++$a){
> > if($a == 2){
> > $next\_update = $bold->item($a)->nodeValue;
> > $next\_update = eregi\_replace('h', '', $next\_update);
> > $next\_update = eregi\_replace('m', '', $next\_update);
>
> Statt der beiden eregi\_replace()-Ersetzungen reicht hier `str_replace(array('h','m'),array(''),$next_update);`{:.language-php} völlig aus.
Danke sehr. Logisch.
> (...)nach Deinem jetzigen Ansatz kann (`if($a == 2)`{:.language-php}) die Variable \_nicht\_ initialisiert sein.
Wieso nicht? Wird $a nicht mit der Schleife initialisiert?
> `$heroes`{:.language-php} ist nicht initialisiert: `$heroes=array();`{:.language-php}
Das ist mir jetzt bisschen peinlich, aber initialisier ich nicht genau mit der Zeile das Array?? Wie müsste ich es machen?
> Werden mehrere Listen der Klasse 'stats' gefunden, werden bereits gefundene Werte schlichtweg überschrieben. In wieweit das aber Relevanz bekommt, weiß ich natürlich nicht.
Ich halt auch nicht, ich kann nicht voraussehen ob und wie sich die Seite ändert und man dann das Script anpassen muss.
Dasselbe gilt für die anderen betroffenen Elemente.
> > if(count($heroes) != 0){
> > $heroes['lifetime'] = $next\_update;
>
> Was wenn `$next_update`{:.language-php} nicht initialisiert wurde, weil kein <b> gefunden wurde?
Danke für den Hinweis!
Michael