[php]Script genereert onnodig dataverkeer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ijsthijs
  • Registratie: Juni 2003
  • Laatst online: 18-09 16:09
Hello,

ik loop voor een mij nieuw probleem aan.
Ik heb een script dat ongeveer 50 onderdelen uitleest uit een mysql database en deze vervolgens netjes weergeeft.

Om wat info over afbeeldingen op te halen gebruik ik "file_exists" & "GetImageSize".
Dit gebeurd vanuit een functie die per onderdeel de output bepaalt.

Echter op een of andere manier vreet het script bandbreedte, het lijkt er op dat de functie de hele afbeelding uitleest en zo circa per aanroep 300 kb opvraagt.

Hieronder de constructie:
PHP:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
// get_parts.php
include "maaktabel.php";
$query = mysql_query("SELECT * FROM zundapp_parts WHERE Categorie = '".$cat."' ORDER BY Categorie,Volgorde");

while($part = mysql_fetch_assoc($query)) {

    echo maaktabel($part['Artikelnummer'],$part['TaalNL'],$part['TaalGB'],$part['TaalDU'],$part['Foto'],$part['PartID']);
}

// maaktabel.php

function maaktabel($serienummer,$taalNL,$taalGB,$taalDU,$fotoinput,$id)
{
    global $taal;
    
    if($fotoinput !== "geen") { 
        
        if(file_exists("/var/www/html/images/parts/".$fotoinput.".JPG")) {
            $size = GetImageSize("http://www.zundappteile.de/images/parts/".$fotoinput.".JPG");
            
        } else {
            if(file_exists("/var/www/html/images/parts/".$fotoinput.".jpg")) {
                $size = GetImageSize("http://www.zundappteile.de/images/parts/".$fotoinput.".jpg");
                
            } 
        }

        if(file_exists("/var/www/html/images/parts/".$fotoinput."_small.JPG")) {
            $src_ext = "JPG";
        } else {
            if(file_exists("/var/www/html/images/parts/".$fotoinput."_small.jpg")) {
                $src_ext = "jpg";
            } 
        }
    
        $groote = $size[0];
        $groote2 = $size[1]+90;
    
        $fotooutput = "
        <a href=\"#".$id."\" title='Enlarge picture' onmouseover=\"window.status='zundapp2/0';return false;\" 
                onmouseout=\"window.status=''; return false\" 
                onclick=\"window.open('/view/vergroting.php?id=".$id."','pix".$id."','width=".$groote.",height=".$groote2.",innerwidth=".$groote.",innerheight=".$groote2.",directories=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,resizable=yes,top=0,left=0,screenX=0,screenY=0');return 
                false\">
        [img]'http://www.zundappteile.de/images/parts/".$fotoinput."_small.".$src_ext."'[/img]</a>";
        clearstatcache();
    }
    if($taal == "nl") {
        $add_txt = "Dit onderdeel toevoegen aan uw vragenlijst.";
    } else {
        $add_txt = "Add this part to your question list";
    }   
    $return = "
    <table border=0>
     <tr>
    <td>
     <table border='0' width='500' height='1'>
        <tr>
          <td width='90' height='1' rowspan='3' align=left valign=top>".$serienummer."<br><a href=\"javascript:add_q('".$id."')\" title='".$add_txt."'>[img]'/view/questions/cart.gif'[/img]</a></td>
         <td width='24' height='1'>NL:</td><td width=320>".$taalNL."</td>
      <td width='50' height='1' rowspan='3'></td>
     </tr>
      <tr>
         <td width='24' height='1'>GB:</td><td width=320>".$taalGB."</td>
       </tr>
       <tr>
          <td width='24' height='1'>D:</td><td width=320>".$taalDU."</td>
     </tr>
      <tr>
       <td width='24' height='25'></td>
     </tr>
       </table>
     </td>
    <td valign=top align=left>
    ".$fotooutput."
    </td>
    </tr>
    </table>";

    return $return;
}
?>

eenechtezzper.nl


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
Ik mis wat je zelf heb geprobeerd om het op te lossen!

Ga even op de php site kijken wat de functie GetImageSize precies doet zou ik zeggen

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

getImageSize en file_exists worden gewoon op het lokale bestandssysteem uitgevoerd en kunnen dus onmogelijk voor bandbreedte gebruik zorgen.

Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Waarom gebruik je een url voor GetImageSize? Als je die vervangt door een filesystem path dan is 't vast opgelost.

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • ijsthijs
  • Registratie: Juni 2003
  • Laatst online: 18-09 16:09
Zelf heb ik gekeken op php.net hoe de functies GetImageSize en FileExists zich gedragen. Daar stond beschreven dat php ze "cached", wat op te lossen was met de functie ClearStatCache. Maar dat heeft geen invloed.

Ik weet 't dus niet meer :/

eenechtezzper.nl


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Waarom roep je de GetImageSize aan via de URl en check je op FS nivo. Je kan ook lokaal de GetIamgeSize ophalen. Werk vele malen sneller en scheel weer voor elek check een apache requets. Aangezien alles toch lokaal staat maakt het allemaal niet uit.

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
Haal de complete url weg, en maak er een localpath van, dat zou het moeten oplossen. Want op deze manier moet php het bestand downloaden om de 'size' te kunnen bereken, lokaal hoeft dat niet

(denk ik) }:O

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Bosmonster schreef op vrijdag 08 juli 2005 @ 13:07:
getImageSize en file_exists worden gewoon op het lokale bestandssysteem uitgevoerd en kunnen dus onmogelijk voor bandbreedte gebruik zorgen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
    if($fotoinput !== "geen") { 
        
        if(file_exists("/var/www/html/images/parts/".$fotoinput.".JPG")) {
            $size = GetImageSize("http://www.zundappteile.de/images/parts/".$fotoinput.".JPG");
            
        } else {
            if(file_exists("/var/www/html/images/parts/".$fotoinput.".jpg")) {
                $size = GetImageSize("http://www.zundappteile.de/images/parts/".$fotoinput.".jpg");
                
            } 
        }

^^ check zijn code ;) En waarschijnlijk wordt er aan de hand van de apach logs de datahoeveelheid/bandbreedte brekekend ;)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Die hoge bandbreedte komt omdat je GetImageSize aanroept met je URL erin, als je het lokaal doet (zoals je ook doet bij file_exists) heb je daar iig geen last meer van.

[ Voor 0% gewijzigd door Sybr_E-N op 08-07-2005 13:11 . Reden: traag ]


Acties:
  • 0 Henk 'm!

  • ijsthijs
  • Registratie: Juni 2003
  • Laatst online: 18-09 16:09
Bedankt voor de reacties, we gaan kijken of dit het verkeer wat gaat reduceren.
Wel vreemd dat er op php.net hier niets over vermeld staat.

eenechtezzper.nl


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
ijsthijs schreef op vrijdag 08 juli 2005 @ 13:14:
Wel vreemd dat er op php.net hier niets over vermeld staat.
Dat is niet vreemd. Het verschil tussen een lokaal pad en een URL kan je moeilijk op elke pagina opnieuw uitleggen en ik denk dat het voor de PHP pagina's als basiskennis beschouwd wordt.

[ Voor 12% gewijzigd door Voutloos op 08-07-2005 13:18 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

:|

Lijkt me logisch dat als je een URL gebruikt dat hij het plaatje dan via de URL binnen gaat halen.

Acties:
  • 0 Henk 'm!

  • ijsthijs
  • Registratie: Juni 2003
  • Laatst online: 18-09 16:09
Echt logisch vond ik het niet, ik ging er van uit dat php slechts "headers" van een image uitleest en daar info uithaalt. Blijkbaar heeft een image geen handige headers met wat bestandsinfo.

eenechtezzper.nl


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
ijsthijs schreef op vrijdag 08 juli 2005 @ 13:21:
Echt logisch vond ik het niet, ik ging er van uit dat php slechts "headers" van een image uitleest en daar info uithaalt. Blijkbaar heeft een image geen handige headers met wat bestandsinfo.
hoe zou php dan die header uit kunnen lezen 8)7 door idd het bestand te gaan downloaden

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Het gaat puur hierom: Als iets lokaal staat, benader het dan ook gewoon lokaal. KISS.

{signature}


Acties:
  • 0 Henk 'm!

  • ijsthijs
  • Registratie: Juni 2003
  • Laatst online: 18-09 16:09
Hij heeft dan toch slechts een fractie van het bestand nodig. Hoe de image vormgegeven is etc doet er niet toe voor getimagesize.

eenechtezzper.nl


Acties:
  • 0 Henk 'm!

  • 4VAlien
  • Registratie: November 2000
  • Laatst online: 24-06 09:47

4VAlien

Intarweb!

ijsthijs schreef op vrijdag 08 juli 2005 @ 13:21:
Echt logisch vond ik het niet, ik ging er van uit dat php slechts "headers" van een image uitleest en daar info uithaalt. Blijkbaar heeft een image geen handige headers met wat bestandsinfo.
Een image heeft wel headers, maar http voorziet niet in het alleen geven van de headers van het bestand, dus moet het hele plaatje wel worden opgehaald.

Acties:
  • 0 Henk 'm!

  • ijsthijs
  • Registratie: Juni 2003
  • Laatst online: 18-09 16:09
Okay, thnx!

eenechtezzper.nl


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ijsthijs schreef op vrijdag 08 juli 2005 @ 13:25:
Hij heeft dan toch slechts een fractie van het bestand nodig. Hoe de image vormgegeven is etc doet er niet toe voor getimagesize.
En toch wordt voor elke operatie die je op een extern bestand wil doen altijd de gehele file binnengehaald. Bezwaar tegen: lees dan zelf de headers uit met fopen en fread tot je aan het eind van de headers bent gekomen. Maar beter: werk gewoon met lokale (liefst relatieve) paden, dan is je script sowieso veel meer portable. Verder: dit hoeft niet gedocumenteerd te staan, het is gewoon logisch. Staat er een url, dan wordt de file opgehaald, en voor zover jouw server weet is een url altijd extern. Het gaat dus gewoon via Apache/IIS, en dat genereert dataverkeer.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 19:49

thomaske

» » » » » »

4VAlien schreef op vrijdag 08 juli 2005 @ 13:25:
[...]


Een image heeft wel headers, maar http voorziet niet in het alleen geven van de headers van het bestand, dus moet het hele plaatje wel worden opgehaald.
Onzin. Er is een HEAD commando in het HTTP protocol wat alleen de headers ophaalt.
(RFC 2616, 9.4)

Probleem is alleen voor dit specifieke geval, dat er geen (meta-)informatie over een afbeelding in staat.

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

Verwijderd

thomaske schreef op vrijdag 08 juli 2005 @ 13:34:
[...]


Onzin. Er is een HEAD commando in het HTTP protocol wat alleen de headers ophaalt.
(RFC 2616, 9.4)

Probleem is alleen voor dit specifieke geval, dat er geen (meta-)informatie over een afbeelding in staat.
Als je het hele topic gelezen had, zou je hebben geweten dat de http headers totaal niet interessant zijn. Het gaat er dan ook om dat het http protocol geen informatie over de file zelf meestuurt in de headers (logisch ook).

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

ripexx schreef op vrijdag 08 juli 2005 @ 13:10:
[...]


PHP:
1
2
3
4
5
6
7
8
9
10
11
    if($fotoinput !== "geen") { 
        
        if(file_exists("/var/www/html/images/parts/".$fotoinput.".JPG")) {
            $size = GetImageSize("http://www.zundappteile.de/images/parts/".$fotoinput.".JPG");
            
        } else {
            if(file_exists("/var/www/html/images/parts/".$fotoinput.".jpg")) {
                $size = GetImageSize("http://www.zundappteile.de/images/parts/".$fotoinput.".jpg");
                
            } 
        }

^^ check zijn code ;) En waarschijnlijk wordt er aan de hand van de apach logs de datahoeveelheid/bandbreedte brekekend ;)
Ah ja.. zo kun je wat ik zei het aardig om zeep helpen ja :P fopen wrappers gebruiken voor getImageSize...
Pagina: 1