php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #10989 Wrong file writing
Submitted: 2001-05-21 10:57 UTC Modified: 2001-05-21 14:49 UTC
From: trax102 at hotmail dot com Assigned:
Status: Not a bug Package: Filesystem function related
PHP Version: 4.0 Latest CVS (2001-05-21) OS: Win2K-Win98-UNIX
Private report: No CVE-ID: None
 [2001-05-21 10:57 UTC] trax102 at hotmail dot com
<?php
//At the end of the script "test.txt" should 
//contains "ADD1ADD2", but, as you can see,
//it will contains just "ADD2".
//Is there a work around for this problem ?

function read_file ($file_name)
{
	$file = fopen($file_name, "r");
	flock($file, 1); 
	$content = trim(fread($file, filesize($file_name)));
	flock($file, 3); 
	fclose ($file);
	return ($content);
}

function write_file ($content, $file_name)
{
	$file = fopen($file_name, "w");
	flock($file, 2);
	fwrite($file, $content);
	flock($file, 3);
	fclose ($file);
}

$filename="test.txt";
write_file("", $filename);

$content = read_file($filename);
$content .= "ADD1";
write_file($content, $filename);

$content = read_file($filename);
$content .= "ADD2";
write_file($content, $filename);
?>

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-05-21 11:52 UTC] trax102 at hotmail dot com
Ok, I've found the solution: simply call clearstatcache() before filesize().
 [2001-05-21 11:55 UTC] derick@php.net
This should not be closed yet, as I think it's a valid bug.

Derick
 [2001-05-21 14:49 UTC] cynic@php.net
It's not. The clearstatcache() is really needed (per manual). The result of filesize() is cached (and it's 0), so on all the calls to read_file() 0 bytes is read, hence 

$filename="test.txt";
write_file("", $filename);
# filesize() returns 0, and the result is cached

$content = read_file($filename);
# read filesize(), i. e. the cached 0 bytes. ok this time
$content .= "ADD1";
write_file($content, $filename);

$content = read_file($filename);
# read filesize(), i. e. the cached 0 bytes. this time it's not ok
# "" == $content
$content .= "ADD2";
write_file($content, $filename);

BTW I think it should be bogusified (user error).
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Mar 28 15:01:29 2024 UTC