Проблемы с записью потоков в PHP-файле - PullRequest
3 голосов
/ 14 апреля 2011

На веб-странице PHP я открываю файл в режиме записи, затем читаю и удаляю первую строку и закрываю файл. (Файл имеет 1000 строк)

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

Для вашей информации, мы используем сервер Windows с сервером IIS и PHP5.
Заранее спасибо за помощь.

Ответы [ 2 ]

6 голосов
/ 14 апреля 2011

Используйте flock для предоставления доступа к файлу только для одного пользователя одновременно.

Но не забудьте снять блокировку файла с помощью fclose

Обновление. Рассмотрим этот код:

<?php
$start = time();
echo 'Started at '.$start.'<br />';
$filename = 'D:\Kindle\books\Brenson_Teryaya_nevinnost__Avtobiografiya_66542.mobi';
$fp = fopen($filename, 'w+') or die('have no access to '.$filename);

if (flock($fp, LOCK_EX)) {
    echo 'File was locked at '.time().'. Granted exclusive access to write<br />';
}
else {
    echo 'File is locked by other user<br />';
}
sleep(3);
flock($fp, LOCK_UN);
echo 'File lock was released at '.time().'<br />';
fclose($fp);
$end = time();
echo 'Finished at '.$end.'<br />';
echo 'Proccessing time '.($end - $start).'<br />';

Запустите этот код дважды (он блокирует файл на 3 секунды, поэтому давайте посмотрим, как наш ручной скрипт выполняется как асинхронный). Вы увидите что-то вроде этого:

Первый экземпляр:

  • Файл был заблокирован на 1302788738. Предоставлен эксклюзивный доступ для записи
  • Блокировка файла была снята в 1302788741

Второе:

  • Файл был заблокирован в 1302788741 . Предоставлен эксклюзивный доступ для записи
  • Блокировка файла была снята в 1302788744

Обратите внимание, что второй экземпляр ждал, пока первый освободит блокировку файла.

Если он не соответствует вашим требованиям, хорошо ... попробуйте придумать другое решение, например: пользователь может прочитать файл, затем он редактирует одну строку и сохраняет ее как временный, другой пользователь сохраняет свой временный файл и т. д., и как только все пользователи сняли блокировку файла, вы создаете новый файл как исправление всех временных файлов друг для друга сохраняйте файлы mtime, чтобы определить, какой файл следует разделить на другой) ... Как-то так ... может быть ... я, к сожалению, не эксперт в такого рода задачах - только мое предположение о том, как вы можете это сделать .

2 голосов
/ 14 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...