You are not logged in.

wcf.regNote.message

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

1

Sunday, May 2nd 2004, 12:39am

timeout für das laden von bildern

hat jemand ne idee wie ich nen timeout einbauen kann für die microbanner? das geht mir so dermaßen auf den s*** das da mansche echt zu blöd oder zu arm sind sich mal nen server zu holen wo so ein kleines 10kb bild anständig auf geht. ständig hängt irgend ein anderes dreck ding. ich will das nach 2 sek. sofort der vorgang abgebrochen wird und einfach kein bild erscheint. jemand ne idee?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Ephraim

Professional

Posts: 826

Location: coder-board.info

Occupation: Info-Student

  • Send private message

2

Sunday, May 2nd 2004, 7:51pm

RE: timeout für das laden von bildern

Jep ... des nervt total :)

Also du könntest dir ein PHP Script basteln des als Bild aggiert ...
Dem Script übergibst du den Pfad zu dem eigentlichen Bild des du laden
willst.
So in dem Script öffnest du dann den Pfad zu dem Bild und ....
ach am besten gleich Code :) versteht man dann wenigstens ;)

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
$data = "";
$bild = fopen("http://www.example.com","r");
if($bild) {
   stream_set_timeout($bild, 2);

   $data = "";
   $status = socket_get_status($bild);
   while(!feof($bild) && !$status['timed_out']) {
       $data .= fgets($bild, 1000);
       $status = socket_get_status($bild);
   }

   if ( $status['timed_out'] ) return false;

   fclose($bild);
} else return false;

echo $data;
?>


Ich hab keine Ahnung obs funtzt probiers einfach mal aus !!

Ciao Ephraim

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

3

Sunday, May 2nd 2004, 8:23pm

jep ok, dann muß ich das nurnoch mit templates usw. umsetzen da das board hier ja nen template parser einsetzt. is dann bisl professioneller ;)

thx jedenfalls für den tip. war so nervös wegen dem scheiß das ich fast die ganze kacke raus geworfen hätte.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

4

Sunday, May 2nd 2004, 10:22pm

sodele ... hab das ganze jetzt mal umgesetzt aber aus irgend einem grund klappt das mit dem bild noch nicht so ganz.

Quoted

// Microbanner //
$count=1;
$cb_microbannerbit.="<tr>";
$microbanner=$db->unbuffered_query("SELECT * FROM bb".$n."_microbanner WHERE active = '1'");
while($microbannerfound=$db->fetch_array($microbanner))
{
// Timeout wenn Bilder nicht auf gehen //
$data = "";
$bild = fopen($microbannerfount['banner'],"r");
if($bild)
{
stream_set_timeout($bild, 2);

$data = "";
$status = socket_get_status($bild);
while(!feof($bild) && !$status['timed_out'])
{
$data .= fgets($bild, 1000);
$status = socket_get_status($bild);
}

if ( $status['timed_out'] ) $data = "http://www.coder-board.info/images/spacer.gif";

fclose($bild);
} else {
$data = "http://www.coder-board.info/images/spacer.gif";
}
// Timeout wenn Bilder nicht auf gehen //
$count++;
$cb_microbannerbit .= "<td align=\"center\" class=\"tablea\" width=\"10%\"><span class=\"smallfont\">";
eval ("\$cb_microbannerbit .= \"".$tpl->get("cb_microbannerbit")."\";");
$cb_microbannerbit .= "</span></td>";
if($count==11)
{
$cb_microbannerbit.="</tr><tr>";
$count=1;
}
}
if($count<11)
{
while($count<11)
{
$count++;
$cb_microbannerbit.="<td class=\"tablea\">&nbsp;</td>";
}
}
$cb_microbannerbit.="</tr>";
// Microbanner //


das template was evaluiert wird enthält nur

Quoted

<a href="$microbannerfound[link]" target="_blank">$microbannerfound[titel]<br /><img src="$data" width="88" height="31" border="0" alt=""></a>


die variable $data enthällt immer nur den spacer (warum auch immer). kann es sein das die ,2 für die 2 sekunden nicht 2 sekunden bedeuten sondern 2 millisekunden? weil so schnell geht das nienicht glaub ich oder?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

braindead

Beginner

Posts: 22

  • Send private message

5

Sunday, May 2nd 2004, 10:27pm

Quoted

Original von Prometheus
while($microbannerfound=$db->fetch_array($microbanner))
{
// Timeout wenn Bilder nicht auf gehen //
$data = "";
$bild = fopen($microbannerfount['banner'],"r");


schau dir erstmal microbannerfound(t) an. ;)

bd

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

6

Sunday, May 2nd 2004, 10:32pm

jojo hab ich auch grade bemerkt das ich mal wieder nen tipfehler hab. jedes mal so nen dreck.

aber dennoch geht es nicht. die var data enthällt ja das bild zeilenweise eingelesen. wie soll ich das nun in nem img tag ausgeben?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

braindead

Beginner

Posts: 22

  • Send private message

7

Sunday, May 2nd 2004, 10:59pm

zwei sachen.

Source code

1
$data = fgets($bild, filesize($bild));


wäre erstmal besser

und

Source code

1
2
3
4
5
6
if ( $status['timed_out'] )
      $data = "http://www.coder-board.info/images/spacer.gif";
      fclose($bild);
} else {
     $data = "http://www.coder-board.info/images/spacer.gif";
}


wundert mich, dass es funzt. fclose($bild) sollte garnicht ausgeführt werden, da dein if keine {} hat, somit wirt nur der erste befehl ausgeführt. und dass es dann noch in das else läuft kann ich fast nicht glauben.

sollte das trotzdem bei dir funzen, überschreibst du $data immer mit spacer.gif.

bd

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

8

Sunday, May 2nd 2004, 11:27pm

Quoted

if ( $status['timed_out'] ) $data = "http://www.coder-board.info/images/spacer.gif";

fclose($bild);

das heißt wenn die if bedingung erfüllt ist wird data auf jeden fall gesetzt. das fclose wird aber so oder so ausgeführt. wenn du ne if bedungung ohne { } machst dann wird immer der befehl ausgeführt der in der gleichen zeile am ende der if klammer steht.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

braindead

Beginner

Posts: 22

  • Send private message

9

Sunday, May 2nd 2004, 11:37pm

ich hab das jetzt erst gesehen, dass das else zu if($bild)gehört. :rolleyes:

keine ahnung, was in $microbannerfount['banner'] steht. wenn da der pfad drin steht, kannst doch damit dein <img> bauen, oder?


bd

This post has been edited 2 times, last edit by "braindead" (May 2nd 2004, 11:40pm)


Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

10

Monday, May 3rd 2004, 12:23am

hab das jetzt mal noch ne runde umgebaut. irgendwas is da noch komisch.

Quoted

// Timeout wenn Bilder nicht auf gehen //
$data = "";
if(file_exists($microbannerfound['banner']))
{
$bild = fopen($microbannerfound['banner'],"r");
} else {
$bild = "";
}
if($bild)
{
stream_set_timeout($bild, 20000000);

$data = "";
$status = socket_get_status($bild);
while(!feof($bild) && !$status['timed_out'])
{
$data .= fgets($bild, 1024);
$status = socket_get_status($bild);
}

if ( $status['timed_out'] )
{
$data = "http://www.coder-board.info/images/spacer.gif";
} else {
$data = $microbannerfound['banner'];
}

fclose($bild);
} else {
$data = "http://www.coder-board.info/images/logo.jpg";
}
// Timeout wenn Bilder nicht auf gehen //

jetzt kommt keine fehlermeldung mehr und eig. sollte es so tun. aber tut es nicht. meine if abfrage "file_exists" liefert IMMER 0 zurück und deswegen is bild nie gesetzt und deswegen is data immer das coder-board banner. ich versteh nicht warum!

die variable $microbannerfound['banner'] enthällt die volle pfadangabe zum microbanner (z.b. http://www.irgendnedomain.de/banner.gif)
somit sollte file_exists doch auch true zurückliefern können oder?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

braindead

Beginner

Posts: 22

  • Send private message

11

Monday, May 3rd 2004, 8:08am

moin,

Quoted

if(file_exists($microbannerfound['banner']))


Quoted

file_exists
(PHP 3, PHP 4 )

file_exists -- Checks whether a file exists
Description
bool file_exists ( string filename)


Returns TRUE if the file specified by filename exists; FALSE otherwise.

This function will not work on remote files; the file to be examined must be accessible via the server's filesystem.

The results of this function are cached. See clearstatcache() for more details.

On windows use "//computername/share/filename" or "\\\\computername\share\filename" to check files on network shares.


wird so also nicht gehen.

Quoted


stream_set_timeout($bild, 20000000);


sind gute 5555 stunden :)

Quoted

socket_set_timeout
(PHP 4 )

socket_set_timeout -- Set timeout period on a socket
Description
bool socket_set_timeout ( int socket descriptor, int seconds, int microseconds)

Sets the timeout value on socket descriptor, expressed in the sum of seconds and microseconds.


bd

This post has been edited 1 times, last edit by "braindead" (May 3rd 2004, 8:14am)


Ephraim

Professional

Posts: 826

Location: coder-board.info

Occupation: Info-Student

  • Send private message

12

Monday, May 3rd 2004, 9:02am

Du solltest aber nicht des $data wenn du ein bild empfangen hast
direkt bei <img src="" angeben weil des ja dann nicht der Pfad auf des Image ist sondern die eigentlichen Bilddaten.

Vielmehr solltest du für jeden Sponsor in der DB dein PHP Script eintregen wie z.b. so:

Source code

1
[URL]http://www.coder-board.info/sponsoren/bilder/loadbild.php?pfad=http://www.example.com/pics/sponsor.jpg[/URL]

und in dem loadbild.php des bild auslesen ... sobald dann der Timeout
kommt kannst du ja dein Bild auslesen und die JPG daten dann als bild
zurückschicken :)....


Ciao Ephraim

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

13

Monday, May 3rd 2004, 9:33am

so jetzt bin ich total durcheinander. file_exists geht nicht. für den bild aufruf muß ich das php skript übergeben. beim timeout das bild dann laden.
was genau is denn da jetzt zu tun? *lach*
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Ephraim

Professional

Posts: 826

Location: coder-board.info

Occupation: Info-Student

  • Send private message

14

Wednesday, May 5th 2004, 11:19am

Also du sollst ein PHP Script basteln, das einen Parameter mitbekommt der
der Pfad zu dem eingentlichen Bild des Sponsors ist.
In diesem Script liest du das Bild des Sponsors ein mit dem fopen
und dem while so wie im ersten Post. Hast du das Bild komplett ohne
Timeout bekommen, kannst du die Daten des Bildes (nicht den Pfad) echo'en.
Bekommst du einen Timeout, liest du ein default Bild aus und gibst die
Daten des Bildes (also wieder NICHT der Pfad des Bildes) zurück.

dein Script baust du dann als Bild ein z.b. so:

Source code

1
<img src="coder-board.info/LoadBild.php?sponsorbild=www.sponsor.de/images/bild.jpg">


Besser ? :)

Ciao Ephraim

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

15

Wednesday, May 5th 2004, 2:08pm

jau jetzt ist klar. hatte den totalen denkfehler gehabt *gg*

ich setz das gegen später sofern ich zeit habe um und dann mal schauen ob es klappt ;)
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

16

Thursday, May 6th 2004, 12:54pm

sodele, ein stück weiter bin ich schonmal allerdings irgendwo hakt es noch und ich find die stelle nicht :(

microbanner.php enthält

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?
$data "";
$bild fopen($loadimg,"r");
if($bild)
{
    stream_set_timeout($bild2);

    $data "";
    $status socket_get_status($bild);
    while(!feof($bild) && !$status['timed_out']) 
    {
        $data .= fgets($bild1000);
        $status socket_get_status($bild);
    }

    if ( $status['timed_out'] ) 
    {
/*        $data = "";
        $ersatzbild = fopen("http://www.coder-board.info/images/spacer.gif","r");
        while(!feof($ersatzbild))
        {
            data .= fgets($ersatzbild,1000);
        }
        fclose($ersatzbild); */ return false;
    }

    fclose($bild);
} else { 
/*    $data = "";
    $ersatzbild = fopen("http://www.coder-board.info/images/spacer.gif","r");
    while(!feof($ersatzbild))
    {
        data .= fgets($ersatzbild,1000);
    }
    fclose($ersatzbild); */ return false;
}

echo $data;
?>


auslesen der microbanner aus der db

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Microbanner //
$count=1;
$cb_microbannerbit.="<tr>";
$microbanner=$db->unbuffered_query("SELECT * FROM bb".$n."_microbanner WHERE active = '1'");
while($microbannerfound=$db->fetch_array($microbanner))
{
    $cb_microbannerbit .= "<td align=\"center\" class=\"tablea\" width=\"10%\"><span class=\"smallfont\">";
    eval ("\$cb_microbannerbit .= \"".$tpl->get("cb_microbannerbit")."\";");
    $cb_microbannerbit .= "</span></td>";
    if($count==10) 
    {
        $cb_microbannerbit.="</tr><tr>";
        $count=1;
    } else {
        $count++;
    }
}
if($count<11)
{
    while($count<11)
    {
        $count++;
        $cb_microbannerbit.="<td class=\"tablea\">&nbsp;</td>";
    }
}
$cb_microbannerbit.="</tr>";
// Microbanner //


und das template enthält (welches hier evaluiert wird)

PHP Source code

1
<a href="$microbannerfound[link]" target="_blank">$microbannerfound[titel]<br /><img src="microbanner.php?loadimg=$microbannerfound[banner]" width="88" height="31" border="0" alt=""></a>


so, wenn ich nun das "return false;" raus nehme so, das der den spacer laden sollte wenn kein bild geladen wurde dann klappt das schonmal nicht. außerdem ist mir unklar wieso die variable "bild" immer leer ist da ich $loadimg auf alle fälle übergebe und auch nichts dagegen spricht das die bilddatei geöffnet wird. hab ich was übersehen oder was is hier nu wieder los?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Ephraim

Professional

Posts: 826

Location: coder-board.info

Occupation: Info-Student

  • Send private message

17

Thursday, May 6th 2004, 1:11pm

Steht in loadimg was??
Wenn nicht probier mal
$_GET["loadimg"] anstatt $loadimg
oder hast du register_globals auf 1 ??

dann steht in loadimg der absolute oder relative Pfad?

Ciao Ephraim

PS.: Warum des mit deinem Ersatz net geht ... hmmm liegt des
vielleicht daran des du vor dem data in der While Schleife kein $ hast ??
Wäre meine erste Vermutung gewesen ;)

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

18

Thursday, May 6th 2004, 1:20pm

nenene ... daran hat es echt gelegen... und loadimg war auch gefüllt nur wenn natürlich da ein fehler im skript ist führt er das nicht aus und gibt einfach nichts zurück ... jetzt klappt es (scheinbar) ... die frage is nur wie ich jetzt noch verhindern kann das wenn ein bild kaputt ist das dann auch der platzhalter eingesetzt wird. naja zumindest denke ich klappt das mit dem timeout jetzt endlich :)
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Ephraim

Professional

Posts: 826

Location: coder-board.info

Occupation: Info-Student

  • Send private message

19

Thursday, May 6th 2004, 1:53pm

hmm meinst du wenn des Bild zwar da ist aber die Daten sind korrupt
oder was ?

hmmm du könntest die ersten und letzten Zeichen überprüfen.
sind ansich immer gleich ;)

Bei JPG:
Die ersten drei Zeichen sind Hex: FF D8 FF
Die letzten zwei Zeichen sind Hex: FF D9

Bei Gif:
Die ersten drei Zeichen sind Hex: 47 49 46
Die letzten zwei Zeichen sind Hex: 00 3B

Allerdings ist das nur von mir so durch "try and error" Verfahren rausgefunden.

Wenn du genaueres über die Dateiformate willst schaust du am
besten mal bei Wotsit.org nach
da findest du super Sachen zu allen möglichen Dateiformaten.
( Aufbau, Sourcen zum selber bauen usw.)

ansonsten hier noch ne kleines if zum überprüfen:

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$loadimg_ext "jpg";

$bildformate = Array("jpg" => Array("0" => "FF""1" => "D8""2" => "FF""-2" => "FF""-1" => "D9"),
                     "gif" => Array("0" => "47""1" => "49""2" => "46""-2" => "00""-1" => "3B")
                       );
$error false;
foreach($bildformate[$loadimg_ext] as $key => $val) {
                   if($key && $data[strlen($data) + $key] != sprintf("%c"hexdec($val))) {
                            $error true;
                            break;
                   }
                   if($key >= && $data[$key] != sprintf("%c"hexdec($val))) {
                            $error true;
                            break;
                   }
}

if(!$error) { echo $data; }
else { echo $data_ersatz; }


Hoffe es funtzt!!!

habs net getestet ;)

Ciao Ephraim

PS.: Die LoadImg Extension musst du dir halt noch dynamisch hollen ;)
und die Werte sind im Array noch als strings ... werd noch ein bissel überprüfen wie ich des machen muss ;)[EDIT]sollte mit dem sprintf in den If's gegessen sein ;)[/EDIT]

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

20

Thursday, May 6th 2004, 1:58pm

irgendwas klappt da aber trotzdem noch nicht. hab im moment ja nen timeout von 2 vorgegeben. da war grade aber ein bild was wesentlich länger gebraucht hat zum laden. es ist also nicht zum timeout gekommen.

wegen dem anderen denke ich nicht das dieses funktionieren wird. weil selbst wenn ich das prüft dann würde der trotzdem das teil mit dem roten kreuz ausgeben da dieses ja auch ein bild ist und folglich auch diese werte enthällt oder?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

wcf.user.socialbookmarks.titel