php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #63908 file_put_contents is not atomic.
Submitted: 2013-01-04 22:12 UTC Modified: 2013-01-08 00:53 UTC
From: awm086 at gmail dot com Assigned:
Status: Not a bug Package: Filesystem function related
PHP Version: Irrelevant OS: LINUX
Private report: No CVE-ID: None
 [2013-01-04 22:12 UTC] awm086 at gmail dot com
Description:
------------
The function file_put_contents is not atomic. When the function fails a file 
should not be created. However, when the reason for failure is full directory, 
(full diskspace, 0 empty), the function return FALSE, but a file is still created 
in 
the directory with size 0. The function should either complete the job 
successfully or have no effects at all (atomic).
 

Test script:
---------------
$data = 'somedata';
$temp_name = '/tmp/myfile';
if (file_put_contents($temp_name, $data) === FALSE) {
    // the message print that the file could not be created.
    print 'The file could not be created.';
}
// after this a file named myfile will exist in the directory.

Expected result:
----------------
No file should be created

Actual result:
--------------
File is created in the directory.

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2013-01-04 23:56 UTC] rasmus@php.net
Sorry, there is no way to guarantee that. Even if we were to check before 
starting to write, there is no way to do an atomic check+write, so in between 
checking and writing even though the check said there should be space to write to 
completion, the filesystem could have filled up by the time we actually do the 
write. If you need this, you have to do it in userspace and apply whatever logic 
makes sense for your environment to ensure that the write is safe.
 [2013-01-04 23:56 UTC] rasmus@php.net
-Status: Open +Status: Not a bug
 [2013-01-05 23:40 UTC] awm086 at gmail dot com
I cannot belive that a function returns false, indicating that a file failed to be 
written, and still write to the file system. There must be a way.
 [2013-01-06 00:09 UTC] rasmus@php.net
Nope, sorry, there isn't. The false indicates that the function wasn't able to 
complete its operation. Much like the underlying filesystem calls, there is no 
such thing as transactions or anything along those lines where you can group a 
bunch of operations into a single atomic unit. That's simply not how filesystem 
operations work.
 [2013-01-06 00:24 UTC] awm086 at gmail dot com
Where can I find the C implementation of the function. I am just curious now.
 [2013-01-07 23:48 UTC] awm086 at gmail dot com
I noticed that function tempname does the same thing. Is that the case?
 [2013-01-08 00:22 UTC] rasmus@php.net
You mean tempnam and no, not at all. tempnam() creates an empty file, it doesn't 
put anything in it. You can't check disk space, create a file and write to it, 
all in one atomic operation.
 [2013-01-08 00:35 UTC] Awm086 at gmail dot com
Sorry I meant tempnam does creat a file even if the directory is full.
 [2013-01-08 00:53 UTC] rasmus@php.net
Well, if the disk is truly full, the tempnam() function wouldn't be able to 
create the file. There is such thing as a "full directory"
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Mon Jul 14 21:01:33 2025 UTC