2012-04-24 5 views
2

Хорошо, я знаю, что на этом сайте были подобные вопросы, но ни один из этих вопросов и предоставленных ответов не совсем то, что мне нужно.Запись в тот же файл в то же самое время

Я строил CMS с файлами на основе файлов. Что делать, если, например:

  1. 2, 3, 10 ..... FWRITE в режим добавления requestes пришел тот же PHP файл "contact_form_messages_container.php" в то же время?

  2. 2, 3, 10 ..... fwrite в режиме «w» запрашивает доступ к одному и тому же файлу php, который содержит простой список конкретных посещений страницы, в то же время?

Я знаю о функции флок(), но это может произойти два или более паствы() запросы приходит на то же самое время ... Кто-нибудь знает решение этой проблемы? Единственное, что у меня на уме, это usleep() - использование скрипта, использующего while looop, в течение некоторого времени, пока целевой файл не станет доступным, но у меня нет идеи, если он будет работать, где и как это сделать? Есть ли у кого-нибудь практический опыт в этой проблеме? Спасибо заранее!

+0

Не настоящий ответ, но ... Используйте базу данных. В самом деле. :П –

ответ

0

Функция flock() предназначена для обработки нескольких параллельных считывателей и писателей для файловых операций; по умолчанию flock() может приостановить процесс до тех пор, пока не будет получен совместимый замок (т. е. общий или эксклюзивный). После получения блокировки позже можно будет освободить, чтобы другие процессы могли работать с файлом; блокировки освобождаются неявно, когда файл закрыт или процесс завершается.

Если ваши файлы не находятся в NFS, я очень сомневаюсь, что вы когда-нибудь столкнетесь с ситуацией, когда одновременно будут заданы два конфликтующих замка.


Ниже показан простой пример использования flock():

// open the file (take care to not use "w" mode) 
$f = fopen('file.txt', 'r+'); 
// obtain an exlusive lock (may suspend the process) 
if (flock($f, LOCK_EX)) { 
    // this process now holds the only exclusive lock 

    // make changes to the file 

    // release the lock 
    flock($f, LOCK_UN); 
} 
// don't perform any write operation on $f here 
fclose($f); 

Использование LOCK_NB флаг вместе с LOCK_EX или LOCK_SH будет препятствовать процессу от быть приостановлено; если вызов возвращает false, третий параметр может быть передан для определения того, был ли процесс приостановлен (не поддерживается в Windows).

if (false === flock($f, LOCK_EX | LOCK_NB, $wouldblock)) { 
    if ($wouldblock) { 
     // the lock could not be obtained without suspending the process 
    } else { 
     // the lock could not be obtained due to an error 
    } 
} 
0

Прокрутите операцию записи и поместите ее в цикл while со сном, пока файл заблокирован. До тех пор, пока ваше приложение не будет зависеть от хронологических запросов к файловой системе, оно должно работать.

Это, однако, открыта для условий гонки, если ваше приложение зависит от того, чтобы операции записи выполнялись по порядку.

Смежные вопросы