仅使用 fopen() 和 fclose() 清除文件是否安全?
Is it safe to clear a file only with: fopen() and fclose()?
我发现这个简单的函数可以简单地清除文件的内容:
function createEmptyFile($filename)
{
//
$fp = fopen($filename, 'w');
//
fclose($fp);
}
例如,重置日志,或其他。
但是我有一个疑问,这个函数是否真的100%安全,即它的行为是唯一确定的,结果会如预期的那样。
我有一种奇怪的感觉,文件有可能:可能没有被清理,或者可能被损坏,或者在某些情况下被随机数据填充。
我明白,也许这都是偏见,但我想知道到底有多正确。特别是,我对打开和关闭手柄之间没有任何命令感到困惑。
例如,我假设如果PHP 解释器将执行优化,那么由于缺少命令,在打开和关闭句柄之间,它可能会跳过这个块,或类似的东西。
对不起,如果我徒劳地制造恐慌。
I am confused by the absence of any command between opening and closing the handle.
让我把一些东西放在前面:
左边的“{”和右边的“}”括号是流控制,中间需要命令。 fopen()
和 fclose()
不是。虽然这些只是 2 个命令,但它们继承了更多命令。
话虽如此,让我们看看他们的任务:fopen()
确实...
- (a) 查找特定文件,
- (b) 如果文件不存在则创建文件
- (c) 打开文件只写,
- (d) 将文件指针重定向到文件开头,
- (e) 如果文件长于零,它将截断为零长度。
In particular, I am confused by the absence of any command between opening and closing the handle.
你看中间有很多"commands"。所以不用担心。
I have a strange feeling that there is a possibility that the file: may not be cleaned
确切地说,文件没有被清除,它被截断为零长度。该文件的早期数据仍在您的数据存储内存中。但这取决于您的操作系统。存在完全删除这些数据块的程序。
[...], or may be damaged
我不明白这个问题。您将要删除一个文件 - 您预计还会有什么损坏?
[...], or filled with random data in some case.
这是 C 风格,通过设置一个指向空闲内存的指针来创建变量,但不清除其中的数据,并将此职责交给您。但这里它只是截断而不是文件指针的重定向。这种恐惧可以被忽略。
But I have a question whether this function is really 100% safe, that is, its behavior is uniquely determined, and the result will be as expected.
是的,通常行为是唯一确定的。但是你必须预料到一些副作用:
- 如果文件不存在,将创建该文件。您需要对该目录具有写入权限。 (否则它会返回 false)
- 如果您没有对该文件的写入权限,它将返回 false。
- 如果您的 php-环境使用 "safe mode",所有者和用户的可能差异会导致
fopen()
失败。您需要确保该文件仅由您使用。
您可能只写了 fopen()
而没有检查 return 参数。这可能会导致问题并导致:如果您没有正确反应,则不是 100% 安全。
所以 - 是的 fopen()
和 fclose()
就足够了,正确并在工作未正确完成时通知您。
我发现这个简单的函数可以简单地清除文件的内容:
function createEmptyFile($filename)
{
//
$fp = fopen($filename, 'w');
//
fclose($fp);
}
例如,重置日志,或其他。
但是我有一个疑问,这个函数是否真的100%安全,即它的行为是唯一确定的,结果会如预期的那样。
我有一种奇怪的感觉,文件有可能:可能没有被清理,或者可能被损坏,或者在某些情况下被随机数据填充。
我明白,也许这都是偏见,但我想知道到底有多正确。特别是,我对打开和关闭手柄之间没有任何命令感到困惑。
例如,我假设如果PHP 解释器将执行优化,那么由于缺少命令,在打开和关闭句柄之间,它可能会跳过这个块,或类似的东西。
对不起,如果我徒劳地制造恐慌。
I am confused by the absence of any command between opening and closing the handle.
让我把一些东西放在前面:
左边的“{”和右边的“}”括号是流控制,中间需要命令。 fopen()
和 fclose()
不是。虽然这些只是 2 个命令,但它们继承了更多命令。
话虽如此,让我们看看他们的任务:fopen()
确实...
- (a) 查找特定文件,
- (b) 如果文件不存在则创建文件
- (c) 打开文件只写,
- (d) 将文件指针重定向到文件开头,
- (e) 如果文件长于零,它将截断为零长度。
In particular, I am confused by the absence of any command between opening and closing the handle.
你看中间有很多"commands"。所以不用担心。
I have a strange feeling that there is a possibility that the file: may not be cleaned
确切地说,文件没有被清除,它被截断为零长度。该文件的早期数据仍在您的数据存储内存中。但这取决于您的操作系统。存在完全删除这些数据块的程序。
[...], or may be damaged
我不明白这个问题。您将要删除一个文件 - 您预计还会有什么损坏?
[...], or filled with random data in some case.
这是 C 风格,通过设置一个指向空闲内存的指针来创建变量,但不清除其中的数据,并将此职责交给您。但这里它只是截断而不是文件指针的重定向。这种恐惧可以被忽略。
But I have a question whether this function is really 100% safe, that is, its behavior is uniquely determined, and the result will be as expected.
是的,通常行为是唯一确定的。但是你必须预料到一些副作用:
- 如果文件不存在,将创建该文件。您需要对该目录具有写入权限。 (否则它会返回 false)
- 如果您没有对该文件的写入权限,它将返回 false。
- 如果您的 php-环境使用 "safe mode",所有者和用户的可能差异会导致
fopen()
失败。您需要确保该文件仅由您使用。
您可能只写了 fopen()
而没有检查 return 参数。这可能会导致问题并导致:如果您没有正确反应,则不是 100% 安全。
所以 - 是的 fopen()
和 fclose()
就足够了,正确并在工作未正确完成时通知您。