[PHP] Hoe een bestand snel vervangen?

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb een PHP script gemaakt die een bestand genereerd. Dit bestand is eerst een tijdelijk bestand, maar wordt aan het einde gekopieerd naar een ander bestand op dezelfde server die weer door bezoekers wordt bekeken.

Samengevat: :)
- PHP script wordt elke 10 minuten gestart.
- PHP script maakt op dezelfde server een tijdelijk bestand (=bestand.txt.tmp), dit duurt een aantal seconden.
- Is dit bestand volledig gemaakt dan wordt deze gekopieerd naar zijn uiteindelijk naam (= bestand.txt):
PHP:
1
2
3
4
<?
$file = "bestand.txt";
copy($file . ".tmp", $file)
?>

Het probleem is echter dat dit kopieren even duurt (een seconde ofzo) en als iemand in die ene seconden bestand.txt opvraagt krijgt ie een half bestand. Dit wil ik dus niet.

Heeft iemand een betere oplossing voor dit probleem?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Waarom denk je dat er een half bestand wordt genomen? Heb je er ervaring mee of verwacht je het gewoon. Ik verwacht namelijk van niet. PHP zal een bestand bij het inlezen in z'n geheel in het geheugen laden. Een OS lockt dit bestand bij het inlezen en pas na het inlezen vrijgeven, waarna het nieuwe bestand eroverheen wordt gekopieert.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zaterdag 15 september 2001 21:38 schreef jelmervos het volgende:
Heeft iemand een betere oplossing voor dit probleem?
Mja, desnoods "tempfile aanmaken" en een "(force) rename" van je tempfile naar de origfile...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op zaterdag 15 september 2001 22:23 schreef Orphix het volgende:
Waarom denk je dat er een half bestand wordt genomen? Heb je er ervaring mee of verwacht je het gewoon. Ik verwacht namelijk van niet.
Ervaring, maar ik ga proberen een rename te doen. Volgens die usernotes op PHP.net is rename een prima functie hiervoor.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Hier een quote over de rename functie van PHP:
Note, that on Unix, a rename is a beautiful way of getting atomic updates to files.

Just copy the old contents (if necessary), and write the new contents into a new file, then rename over the original file.

Any processes reading from the file will continue to do so, any processes trying to open the file while you're writing to it will get the old file (because you'll be writing to a temp file), and there is no "intermediate" time between there being a file, and there not being a file (or there being half a file).

Oh, and this only works if you have the temp file and the destination file on the same filesystem (eg. partition/hard-disk).

"The shell stopped unexpectedly and Explorer.exe was restarted."