Avatar billede michaelthomassen Nybegynder
28. juli 2003 - 09:52 Der er 10 kommentarer og
1 løsning

Timeout for fgetss

Jeg har følgende kode liggende på min side:


$host = "www.???.dk";
$page = "???";
$sock = fsockopen($host, 80);
fputs($sock, "GET /" . $page . " HTTP/1.0\r\n Host: " . $host . "\r\n\r\n");

while (!feof($sock)) {
  $lines[] = ltrim(fgetss($sock,8192));
}
fclose($sock);


Hvordan får jeg den til at time ud efter 5 sekunder ? Altså hvis den ikke har loaded hele siden inden for 5 sekunder, skal den hoppe videre.

På forhånd tak.
Avatar billede sukos Juniormester
28. juli 2003 - 10:09 #1
<?php
ini_set("max_execution_time", "2");
$host = "www.efefefefefef.dk";
$page = "/bruger.phtml?navn=michaelthomassen";
$sock = @fsockopen($host, 80);
@fputs($sock, "GET /" . $page . " HTTP/1.0\r\n Host: " . $host . "\r\n\r\n");
$lines = array();
if($sock) {
while (!@feof($sock)) {
$lines[] = ltrim(@fgetss($sock,8192));
    }
fclose($sock);
}else{
echo"Videre";
    }
?>

2 skulle så være sekunder, men det kører cirka 5 her hos mig :O)
Ved ikke om det kan bruges?
Avatar billede michaelthomassen Nybegynder
28. juli 2003 - 10:21 #2
Hvis man sætter max_execution_time, er det så ikke den maksimale tid for selve sidens udarbejdelse ? Det hjælper ikke da jeg gerne ville udskrive noget hvis den ikke henter den eksterne side inden for 5 sekunder.

Måske et noob spørgsmål (er lige startet med PHP for 1½ måned siden), men jeg kan se du har tilføjet @ foran nogen af funktionerne, hvilken forskel gør det ?
Avatar billede sukos Juniormester
28. juli 2003 - 10:33 #3
@ hindrer fejlmeddelser, kunne også sættes med error_reporting(0) i toppen af siden.
Og jow, det er tiden som sciptet må bruge på at afvikles.
Men henter den ikke, vil der lige nu stå videre.
Avatar billede michaelthomassen Nybegynder
28. juli 2003 - 10:45 #4
Ja, den vil skrive "videre" fordi siden ikke bliver fundet.
Mit problem er at den side jeg henter fra en gang i mellem har problemer. Hvis man går ind på siden med en alm. browser, den bare stå og vente med en blank side.
Forestil dig en php side der indeholder en uendelig løkke og max_execution_time er sat til f.eks. 3600. Hvis du prøver at hente denne side, vil dit eksempel ikke udskrive "videre", korrekt ?
Avatar billede michaelthomassen Nybegynder
28. juli 2003 - 10:50 #5
Denne her løsning vil vel heller ikke virke, da den hænger i fgetss:

$host = "www.???.dk";
$page = "???";
$sock = fsockopen($host, 80);
fputs($sock, "GET /" . $page . " HTTP/1.0\r\n Host: " . $host . "\r\n\r\n");

$starttime = time();
while (!feof($sock) && (time() - $starttime < 5)) {
  $lines[] = ltrim(fgetss($sock,8192));
}
fclose($sock);
Avatar billede andy Nybegynder
28. juli 2003 - 11:02 #6
$host = "www.???.dk";
$page = "???";
$sock = fsockopen($host, 80);
fputs($sock, "GET /" . $page . " HTTP/1.0\r\n Host: " . $host . "\r\n\r\n");
stream_set_timeout($sock, 2);
while (!feof($sock)) {
  $lines[] = ltrim(fgetss($sock,8192));
}
fclose($sock);

Se mere på http://dk.php.net/manual/en/function.stream-set-timeout.php
Avatar billede michaelthomassen Nybegynder
28. juli 2003 - 11:10 #7
@Andy: Ser ud til at det er lige præcis det jeg har brug for. Lige et par tillægs spørgsmål: Er det en global setting, altså skal jeg sætte den tilbage til noget bagefter ? Hvad står den til som default ?

Svar -> point
Avatar billede andy Nybegynder
28. juli 2003 - 11:12 #8
Der er ingen default så det er ikke noget der skal ændres tilbage.
Avatar billede michaelthomassen Nybegynder
28. juli 2003 - 11:12 #9
Og lige et sidste spørgsmål: Hvordan checker jeg på om den har fået en timeout, eller om siden er loaded uden problemer ?
Avatar billede andy Nybegynder
28. juli 2003 - 11:17 #10
Med http://dk.php.net/manual/en/function.stream-get-meta-data.php

$res = stream_get_meta_data($sock);
if ($res['timed_out']) { echo "Connection timed out"; }
Avatar billede sukos Juniormester
28. juli 2003 - 12:41 #11
hehe, dejligt at blive lidt klogere! :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester