PHP и параллельный доступ к файлу

Решение с DimDate выглядит очень красиво и легко читаемо: Tx all again.

/*
SELECT TOP (DATEDIFF(DAY, '20180701', '20190101'))  
        DATEADD(dd,ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1,'20180701') dt
 INTO dbo.Calendar
  FROM sys.all_columns sc1,         sys.all_columns sc2;           --             drop table Calendar

--  select * from Calendar  --184
*/
with cte as (
   SELECT t.*,  c.dt
   FROM   test  t
   join Calendar c on c.dt  between t.DateFrom  and t.DateTo     
)
 select Code, count(Distinct dt) from cte
 group by Code
 Having count(Distinct dt) <> 184
11
задан Bill the Lizard 26 September 2009 в 16:40
поделиться

4 ответа

Необходимо поместить блокировку на файл

    $fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

Смотрите на http://www.php.net/flock

22
ответ дан 3 December 2019 в 01:39
поделиться

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

11
ответ дан 3 December 2019 в 01:39
поделиться

Единственный файл для многих пользователей действительно не должен быть стратегией, которую Вы используете, я не думаю - иначе необходимо будет, вероятно, реализовать единственную (глобальную) точку доступа, которая контролирует, если файл в настоящее время редактируется или нет. Aquire блокировка, сделайте свою модификацию, выпустите блокировку и т.д. Я пошел бы с 'Ничьим предложением для использования базы данных (SQLite, если Вы не хотите издержки полностью украшенного RDBMS),

2
ответ дан 3 December 2019 в 01:39
поделиться

Вы могли сделать вид журнала фиксации формата, вид того, как Википедия делает.

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

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

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

Вы могли поместить управление версиями (GIT/MERCURIAL/SVN) на файловую систему и затем автоматизировать фиксации во время фазы сохранения,

Псевдокод:

 user->save : 
   getWritelock(); 
   write( $file ); 
   write_commitmessage( $commitmessagefile ); # <-- author , comment, etc 
   call "hg commit -l $commitmessagefile $file " ; 
   releaseWriteLock(); 
 done.

По крайней мере, этот путь, когда 2 человека сделают критические фиксации одновременно, ни один не потеряется.

3
ответ дан 3 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: