file_put_contents擦除文件

时间:2011-05-25 21:01:11

标签: php file-io

如果两个人在大约5毫秒之内加载同一页面,那么两个同时进行的file_put_contents调用似乎会将文件清空,从而丢失所有数据。

如何安全地写文件,使文件永远不会被删除空白,无论有多少人在同一时间加载页面?

我不能使用mysql数据库,这非常过分。

3 个答案:

答案 0 :(得分:4)

file_put_contents有第三个参数。在那里写LOCK_EX

答案 1 :(得分:1)

在你的php中使用while循环并检查文件锁定。

这是一些阅读 http://php.net/manual/en/function.flock.php

修改

$fp = fopen("/tmp/lock.txt", "r+");
while(!flock($fp, LOCK_EX))
      {
      usleep(10);
      }
//do stuff
flock($fp, LOCK_UN);
fclose($fp);

答案 2 :(得分:0)

/**
 * Writes a file without the worry on simultaneous file writings.
 *
 * @param mixed $data - Data to put into the file.
 * @param string $filePath - Path to the file to put data into.
 * @param number $timeOut - The maximum time (milliseconds) until method attempts to write file (defaults to 1000).
 * @return bool - Returns true if data has been written.
 */
function writeDataToFileSafely($data, $filePath, $timeOut = 1000)
{
    $interval = 10; // milliseconds
    $elapsed = 0;
    $success = false;

    while($success === false && $elapsed < $timeout)
    {
        $success = file_put_contents($filePath, $data, LOCK_EX);
        usleep(interval * 1000); // to microseconds
        $elapsed += $interval;
    }

    return $success;
}