file_put_contents стирает файл - PullRequest
1 голос
/ 26 мая 2011

Если два человека загружают одну и ту же страницу в течение приблизительно 5 миллисекунд друг от друга, два одновременных вызова file_put_contents, похоже, стирают файл пустым, теряя все данные.

Как можно безопасно записать файлы таким образом, чтобы файл никогда не был очищен пустым, независимо от того, сколько человек загружают страницу одновременно?

Я не могу использовать для этого базу данных mysql, это было бы чрезмерно.

Ответы [ 3 ]

4 голосов
/ 26 мая 2011

file_put_contents имеет третий параметр.Напишите LOCK_EX там.

1 голос
/ 26 мая 2011

В вашем php используйте цикл while и проверьте блокировку файла.

Вот немного чтения http://php.net/manual/en/function.flock.php

EDIT

$fp = fopen("/tmp/lock.txt", "r+");
while(!flock($fp, LOCK_EX))
      {
      usleep(10);
      }
//do stuff
flock($fp, LOCK_UN);
fclose($fp);
0 голосов
/ 06 марта 2014
/**
 * 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...