Что может произойти между существованием файла и сохранением файла с определенным именем (php)?


Из-за того, как Сервер может обрабатывать запросы (-> Одновременные запросы к PHP-скрипту), У меня есть вопрос о том, что может произойти, если скрипт проверяет имя файла, а затем сохраняет файл.

Например: Запросы пользователя А"save.php ". Действительно короткое время спустя Пользователь B запрашивает"save.php ". Сценарий пользователя A находится в точке, где сценарий проверяет, существует ли файл. Файл не существует, и ДО того, как файл будет записан, сценарий пользователя B находится в точке, где он проверяет наличие файла. Таким образом, это также говорит о том, что файл не существует. Теперь скрипт пользователя А записывает файл. И сценарий пользователя B перезаписывает файл, если у них одно и то же имя файла. (Имя файла является случайным, но это может произойти).

Как я могу избежать подобных вещей? Есть ли что-то вроде блокировки таблиц и транзакций для PHP-команды? Возможно ли, что сценарий пользователя B опережает сценарий пользователя A, потому что он получает больше ресурсов с сервера?

С наилучшими пожеланиями

Author: Community, 2013-04-11

2 answers

Пожалуйста, взгляните на:

Http://www.php.net/manual/en/function.fopen.php

Вам необходимо использовать эксклюзивную блокировку при создании файла следующим образом:

$handle = fopen("/home/somewhere/yourfile.txt", "x");

Когда вы делаете это подобным образом, попытки вторичного доступа (пользователя B, C) к файлу вернут значение false и выдадут предупреждение, поскольку файл создан и заблокирован исключительно пользователем A.

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

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

Ручной ввод для режимов x и x+ выглядит следующим образом:

'x'

Создайте и откройте только для записи; поместите указатель файла в начало файла. Если файл уже существует, вызов fopen() завершится ошибкой, возвращая значение FALSE и генерируя ошибку уровня E_WARNING. Если файл не существует, попытайтесь его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для базового системного вызова open(2).

'x+'

Создайте и откройте для чтения и записи; в противном случае он будет вести себя так же, как "x".

 2
Author: Ihsan, 2013-04-11 08:25:50

Используйте семафор, если ваша установка php поддерживает его : http://be2.php.net/manual/en/ref.sem.php

В качестве альтернативы вы также можете проверить функцию flock() : http://be2.php.net/manual/en/function .flock.php

 2
Author: Damien Legros, 2013-04-11 07:09:01