PHP одновременная копия файла

0

Я работаю над веб-приложением PHP, моим первым веб-приложением. Один из процессов должен скопировать некоторые текстовые файлы в целевой каталог. В каталоге назначения он откроет текстовые файлы и покажет вывод в веб-браузере. Мне интересно, что произойдет, если два пользователя одновременно инициируют процесс? Поскольку файлы ДОЛЖНЫ быть скопированы в каталог назначения и прочитаны оттуда. Я каждый раз создаю уникальный каталог назначения? Как это правильно сделано?

Теги:
copy
concurrency

1 ответ

1

Вы можете создать уникальный каталог, все зависит от вашей цели. Вы хотите разрешить одновременному выполнению двух разных пользователей?

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

В этом случае, если вы хотите, чтобы второй пользователь не запускал процесс в одно и то же время, вы можете использовать файл блокировки:

  1. Создайте файл блокировки, если он не существует
  2. Запуск процессов
  3. Отключить файл блокировки

Если файл блокировки существует, подождите, пока он не будет отсоединен (удален), например:

while (file_exists('file.lock')) {
   usleep(100000); // sleep 100ms
}
touch('file.lock');
// Execute processes here
unlink('file.lock');

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

  • 0
    Да, я хотел бы разрешить двум или более пользователям выполнять его одновременно. Вместо того, чтобы блокировать пользователей, я бы хотел, чтобы они могли запускать процесс в любое время. Итак, нет ничего плохого в создании уникальных каталогов?
  • 1
    Я не вижу в этом ничего плохого, конечно, я мало представляю, что вы делаете. Я бы порекомендовал поместить их в каталог, такой как process / sessionid, и затем удалить sessionid, когда вы закончите очистку (если вы не планируете использовать их позже)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню