[php] fread kapt af

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een systeem bedacht om de load van mijn server een beetje te beperken. Dit doe ik doormiddel van php bestanden na zoveel tijd uit te lezen en daarvan .html bestanden te maken.

Dit doe ik doormiddel van dit scriptje:

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
<?php 
$url = "http://www."; 
$sourcepage = "$url/right.php"; 

$tempfilename = "tmp/temp_right.html"; 
$targetfilename = "/www/htdocs/tmp/rightn.html"; 
$dynamic_source = fopen($sourcepage, 'r'); 
if (!$dynamic_source) { 
echo "<strong>Unable to load $sourcepage 
- Static page! Update Failed!</strong>"; 
exit(); 
} 


$htmldata = fread($dynamic_source, 4096*4096); 
fclose($dynamic_source); 
$tempfile = fopen($tempfilename, 'w'); 

if (!$tempfile) { 
echo"<strong>Unable to open temporary file $tempfilename for writing! 
Static page update aborted!</strong>"; 
exit(); 
} 

fwrite($tempfile, $htmldata); 
fclose($tempfile); 

copy($tempfilename, $targetfilename); 
unlink($tempfilename); 

?>


Het gaat dus om het bestand: http://www./tmp/menu/right.php

Die moet volledig gekopieerd worden naar http://www.net/tmp/rightn.html

Dit gaat gedeeltelijk goed maar op een of andere manier kapt ie hem af na zoveel bytes zoals te zien is op de .html pagina. Wat doe ik fout??

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

buffer the klein? Misschien wil je deze functie: http://nl.php.net/manual/en/function.file-get-contents.php

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • S-Force
  • Registratie: Februari 2002
  • Laatst online: 19-09 21:16
$htmldata = fread($dynamic_source, 4096*4096);

string fread ( resource handle, int length);

Je hebt een length van 4096*4096

code:
1
2
3
4
5
6
7
<?php
// get contents of a file into a string
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>



edit:

Net iets te laat.
En de functie file_get_contents lijkt mij wel handiger dan deze oplossing

[ Voor 24% gewijzigd door S-Force op 23-11-2004 12:26 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-09 18:51
Dat heeft niets met een te kleine buffer te maken, maar als je leest van een HTTP-stream dan wordt in PHP je buffer niet altijd helemaal gevuld. Om te voorkomen dat je nodeloos lang moet wachten wordt een buffer gevuld met een deel van de gegevens die beschikbaar zijn. Om alle gegevens in te lezen moet je fread in lus gebruiken. De standaardcode ziet er zo uit:
code:
1
2
3
4
5
6
$fin = fopen("http://....", "r");
$fout = fopen("...", "w");
while($data = fread($fin, 8192))
    fwrite($fout, $data);
fclose($fin);
fclose($fout);
Je hoeft dan gelijk niet meer zo'n achterlijk grote buffer te gebruiken.

Als geheugengebruik geen issue is kun je inderdaad ook gewoon file_get_contents gebruiken; dat is een stuk korter en netter.

[ Voor 13% gewijzigd door Soultaker op 23-11-2004 12:34 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soultaker schreef op dinsdag 23 november 2004 @ 12:32:
Dat heeft niets met een te kleine buffer te maken, maar als je leest van een HTTP-stream dan wordt in PHP je buffer niet altijd helemaal gevuld. Om te voorkom..
code:
1
2
3
4
5
6
$fin = fopen("http://....", "r");
$fout = fopen("...", "w");
while($data = fread($fin, 8192))
    fwrite($fout, $data);
fclose($fin);
fclose($fout);
Je hoeft dan gelijk niet meer zo'n achterlijk grote buffer te gebruiken.

Als geheugengebruik geen issue is kun je inderdaad ook gewoon file_get_contents gebruiken; dat is een stuk korter en netter.
precies wat ik zocht _/-\o_

[ Voor 17% gewijzigd door Verwijderd op 23-11-2004 12:40 ]