[PHP] Een url testen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Ik zal het even kort uitleggen, ik ben met een website bezig waarop gebruikers links moeten kunnen invoeren welke hij alsvolgd in een database moet zetten, alleen moeten de links eerst getest worden, aangezien het hier om plaatjes gaan om kruisjes te voorkomen...

code:
1
2
$handle1 = fopen("$usc1","r");
if($handle1 != ""){fclose($handle1);}

dit heb ik tot nu toe dus.
Werkt heel goed als de url bestaat maar bestaat deze niet. krijg ik de volgende error
code:
1
Warning: fopen(http://quatsch.free.fr/gamins/banner.jpg2): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/free.fr/9/7/quatsch/nsh/sendin.php on line 15


niet echt mooi ... :P ik ben de hele avond nu al op zoek en een beetje ten einde raad... mischien dat hier iemand een ideetje voor me heeft?

Acties:
  • 0 Henk 'm!

Verwijderd

geen idee of dit werkt, maar is dit iets:

PHP:
1
if (file_exists($usc1)) {...}

Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
@fopen(http://quatsch.free.fr/gamins/banner.jpg2);

Levert als het goed is geen warning op, maar je kan wel de return-waarde van fopen uitlezen om zo te kijken of de afbeelding bestaat

edit
of gewoon in php.ini warnings uitschakelen

[ Voor 30% gewijzigd door Verwijderd op 08-03-2005 20:56 ]


Acties:
  • 0 Henk 'm!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
staat niet op mijn eigen server dus warnigns uitzetten ,,, ?

en file_exists() werkt alleen het te openen bestand op dezelfde server als script staat

Acties:
  • 0 Henk 'm!

Verwijderd

Ja zoiets dacht ik al.. daarom ook 'geen idee of dit werkt' ;)

was worth the try..

oh, warnings :

http://nl3.php.net/error_reporting
http://nl3.php.net/manual...nc.php#ini.display-errors

[ Voor 53% gewijzigd door Verwijderd op 08-03-2005 20:53 ]


Acties:
  • 0 Henk 'm!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Verwijderd schreef op dinsdag 08 maart 2005 @ 20:52:
Ja zoiets dacht ik al.. daarom ook 'geen idee of dit werkt' ;)

was worth the try..
geeft niet thnx anyway :)

Acties:
  • 0 Henk 'm!

Verwijderd

http://www.vemix.com/TuFlashP5.phplaat maar ;)

[ Voor 22% gewijzigd door Verwijderd op 08-03-2005 20:54 ]


Acties:
  • 0 Henk 'm!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Verwijderd schreef op dinsdag 08 maart 2005 @ 20:52:
Ja zoiets dacht ik al.. daarom ook 'geen idee of dit werkt' ;)

was worth the try..

oh, warnings :

http://nl3.php.net/error_reporting
http://nl3.php.net/manual...nc.php#ini.display-errors
THNX Man ! en ik vind zoiets niet? :(
nou sorry mensen dit is in principe genoeg... k krijg nou geen error meer maar als iemand nog een mooiere oplossing heeft is dat altijd welkom :)

Acties:
  • 0 Henk 'm!

  • RedLizard
  • Registratie: Februari 2005
  • Laatst online: 13:44
Je zou een socket kunnen connecten naar de server waar het bestand opstaat, en dan een http GET request sturen. Dan kan je aan de statuscode zien of hij bestaat. Het probleem is echter dat de server dan ook inderdaad het hele bestand gaat overpompen, wat een performance hit oplevert.

EDIT: misschien is dit juist een goed idee, omdat je op die manier kunt bepalen dat het plaatje wel bestaat, maar toch niet zo geschikt is voor gebruik (omdat hij te groot is, omdat de server te traag reageert, etc).

[ Voor 28% gewijzigd door RedLizard op 08-03-2005 22:55 ]


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Palinchron schreef op dinsdag 08 maart 2005 @ 22:54:
Je zou een socket kunnen connecten naar de server waar het bestand opstaat, en dan een http GET request sturen. Dan kan je aan de statuscode zien of hij bestaat. Het probleem is echter dat de server dan ook inderdaad het hele bestand gaat overpompen, wat een performance hit oplevert.

EDIT: misschien is dit juist een goed idee, omdat je op die manier kunt bepalen dat het plaatje wel bestaat, maar toch niet zo geschikt is voor gebruik (omdat hij te groot is, omdat de server te traag reageert, etc).
Ik weet niet in hoeverre fopen ook werkelijk de bestanden ophaalt, maar als je dan toch zoiets doet dan kun je ook gewoon een head-request (ipv get-request) sturen en dan uit de headers halen hoe groot iets is (content-length header).

Overigens, de check is wel zodanig voor de helft dat als een gebruiker eerst ergens een plaatje neerzet en deze weghaalt na het toevoegen van de link dan is er nog een kruisje ;).

Acties:
  • 0 Henk 'm!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Shadowman schreef op dinsdag 08 maart 2005 @ 23:18:
[...]
Ik weet niet in hoeverre fopen ook werkelijk de bestanden ophaalt, maar als je dan toch zoiets doet dan kun je ook gewoon een head-request (ipv get-request) sturen en dan uit de headers halen hoe groot iets is (content-length header).

Overigens, de check is wel zodanig voor de helft dat als een gebruiker eerst ergens een plaatje neerzet en deze weghaalt na het toevoegen van de link dan is er nog een kruisje ;).
daar heb je gelijk in maar bedoeling is dat gebruikers imageshack gebruiken ... dus dat zou wel wat mee moeten vallen ...

Acties:
  • 0 Henk 'm!

Verwijderd

Joepho schreef op woensdag 09 maart 2005 @ 09:46:
[...]


daar heb je gelijk in maar bedoeling is dat gebruikers imageshack gebruiken ... dus dat zou wel wat mee moeten vallen ...
Dan betwijfel ik het of het allemaal wel kan omdat imageshack altijd iets teruggeeft (pagina, afbeelding) dat door fopen kan worden geopend; ook als de afbeelding niet bestaat. Of zit ik nou fout?

Acties:
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 20:45

RM-rf

1 2 3 4 5 7 6 8 9

Joepho schreef op dinsdag 08 maart 2005 @ 20:55:
[...]


THNX Man ! en ik vind zoiets niet? :(
nou sorry mensen dit is in principe genoeg... k krijg nou geen error meer maar als iemand nog een mooiere oplossing heeft is dat altijd welkom :)
Dit is een hele lelijke oplossing, die namelijk voor je gehele scripting de extra foutmeldingen en ook notices uitzet, zeker als je nog een beetje aan het leren bent, is dit niet aan te raden, omdat het vaak niet motiveert om onveilige oplossingen binnen je code op te lossen, losse eindjes weg te halen ...

veel beter was de oplossing van [rml]HereIam in "[ PHP] Een url testen"[/rml] om gewoon een @ voor je functie aanroep te zetten, op dat moment zet je enkel de open foutmleding voor die specifieke functie uit, en blijven je foutmeldingen en notices gewoon bestaan, waardoor je ook gedwongen bent een stuk corrcter te werken, ook op momenten dat die kleine foutjes geen echt grote problemen lijken op te leveren ...

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

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

thomaske

» » » » » »

Ik gebruik altijd deze functie
(met @'s zoals Heralam en RM-rf al eerder aangaven)

PHP:
1
2
3
function remote_file_exists ($url) {
    return @fclose(@fopen($url));
}


Dit is een stuk sneller dan een socket te openen en dan een http head request te sturen.

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

Of je laat het aan de client over :) Die heeft de processor kracht en de resources :)

Heb zoiets zelf eens uitgetest op haalbaarheid :) Ik gebruik echter xmlHttpRequest en haal alleen de headers op met Javascript. Je krijgt echter sinds SP2 te maken met cross domain access. Dus zonder deze opties aan te passen in IE, krijg je "permission denied".

Daar liep het uiteindelijk op stuk.


http://www.mschopman.demon.nl/linkchecker.html

[ Voor 44% gewijzigd door Verwijderd op 09-03-2005 11:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

thomaske schreef op woensdag 09 maart 2005 @ 11:05:
Ik gebruik altijd deze functie
(met @'s zoals Heralam en RM-rf al eerder aangaven)

PHP:
1
2
3
function remote_file_exists ($url) {
    return @fclose(@fopen($url));
}


Dit is een stuk sneller dan een socket te openen en dan een http head request te sturen.
Zoals je misschien wel weet doet php precies hetzelde als je een fopen op een url doet. Dus qua snelheid maakt het helemaal niets uit.

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
thomaske schreef op woensdag 09 maart 2005 @ 11:05:
Ik gebruik altijd deze functie
(met @'s zoals Heralam en RM-rf al eerder aangaven)

PHP:
1
2
3
function remote_file_exists ($url) {
    return @fclose(@fopen($url));
}


Dit is een stuk sneller dan een socket te openen en dan een http head request te sturen.
Hoe checkt fopen volgens jou dan of een bestand bestaat? Ook via een http-request via een socket. Als fopen een GET-request stuurt is dit imho trager dan wanneer je zelf via sockets een HEAD-request stuurt.

Acties:
  • 0 Henk 'm!

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

thomaske

» » » » » »

Shadowman schreef op woensdag 09 maart 2005 @ 12:47:
[...]
Hoe checkt fopen volgens jou dan of een bestand bestaat? Ook via een http-request via een socket. Als fopen een GET-request stuurt is dit imho trager dan wanneer je zelf via sockets een HEAD-request stuurt.
Heb even snel een testcase gemaakt en deze ge-benchmarked
gemiddelde tijd over 100 checks met de fopen/fclose functie: 8.09ms (gemiddelde over 100 pogingen)
gemiddelde tijd over 100 checks met de socket-functie: 476ms (gemiddelde over 100 pogingen)

vond het verschil nogal groot.

edit:
Ondertussen onderstaande functie al wat getunded en kost nu nog 476ms ipv 562ms)


disclaimer: deze socket-functie heb ik ergens op internet gevonden, en zal ongetwijfeld nog getuned kunnen worden:
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
function remote_file_exists ($url) 
{ 
/*
    Return error codes:
    true: file exists
    false: file not exists (404)
    -1 = Invalid URL host
    -2 = Unable to connect to remote host
*/  
    $head = ''; 
    $url_p = parse_url ($url); 
    
    if (isset ($url_p["host"])) {
        $host = $url_p["host"];
    } else {
        return -1;
    }
    
    $path = isset ($url_p['path']) ? $url_p['path'] : '';
    
    $fp = fsockopen ($host, 80, $errno, $errstr, 20); 
    if (!$fp) return -2;

    fputs($fp, "HEAD ".$url." HTTP/1.1\r\nHOST: ".$host."\r\nConnection: close\r\n\r\n"); 

    $headers = ''; 
    while (!feof ($fp)) {
        $headers .= fgets ($fp, 128);
    } 
    fclose ($fp); 

    $arr_headers = explode("\n", $headers); 
    $return = false;
    if (isset ($arr_headers[0])) {
        $return = strpos ($arr_headers[0], "404") === false;
    }
    return $return; 
}

[ Voor 17% gewijzigd door thomaske op 09-03-2005 13:48 ]

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!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Met @'s werkt het inderdaad ook ik denk dat ik het daar maar bij laat :) thnx allemaal!
Pagina: 1