Проблемы с проверкой существования каталога PHP

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

Каталог создается, но если в то же время запускается другой экземпляр того же скрипта, проверка существования каталога работает неправильно (предупреждает PHP).

Кто-то сказал мне, что это состояние гонки, но у меня все еще есть эта проблема после добавления случайного времени сна.

usleep(mt_rand(1, 50));

if(!is_dir($dir)){
  mkdir($dir);    
}

usleep(mt_rand(1, 50));

кто-нибудь может помочь?

Кто-нибудь знает безопасный способ загрузки файла в несколько частей, когда 3-4 части загружаются одновременно? В настоящее время я перемещаю загруженные части во временный каталог (is_dir терпит неудачу во временном каталоге, если одновременно поступает больше частей), затем, когда количество файлов из этого каталога равно количеству частей, части объединяются. Но это много раз терпит неудачу, иногда is_dir выдает предупреждение, иногда части объединяются дважды...


person J. Doe    schedule 13.05.2016    source источник
comment
Можете ли вы объяснить, что вы подразумеваете под неправильной работой?   -  person Dan O'Boyle    schedule 13.05.2016
comment
Используйте механизм блокировки и файл где-нибудь, чтобы вы могли проверить, извлечен ли он. htmlite.com/php043.php, если файл заблокирован, не создавайте каталог.   -  person Roger    schedule 13.05.2016
comment
можешь написать предупреждение?   -  person Gumma Mocciaro    schedule 13.05.2016
comment
Предупреждение mkdir(): файл существует   -  person J. Doe    schedule 13.05.2016
comment
Neoaptt на самом деле я использую flock для файлов, и это тоже не работает. 1 из 10 раз проверка блокировки завершается неудачей, и мои файлы объединяются дважды. Я больше не знаю, что делать, так много проблем при работе с одновременной загрузкой файлов в PHP........ glob не работает, is_dir не работает, flock не работает..   -  person J. Doe    schedule 13.05.2016
comment
Можете ли вы определить, запускается ли другой экземпляр одного и того же скрипта в то же время, так как то, что эти вещи выполняются точно одновременно с двумя браузерами, запускающими один и тот же скрипт независимо, крайне маловероятно и не должно вызывать ваши проблемы . не могли бы вы уточнить, что на самом деле означает эта фраза?   -  person Martin    schedule 13.05.2016
comment
JavaScript для загрузки разбивает файл на несколько частей и отправляет 4 ajax-запроса на php, поэтому php получает 4 части одновременно. когда все части получены, php должен объединить их, чтобы воспроизвести файл на сервере   -  person J. Doe    schedule 13.05.2016
comment
@J.Doe Я обновил свой ответ, чтобы отразить этот комментарий.   -  person Martin    schedule 14.05.2016


Ответы (2)


mkdir() возвращает true в случае успеха и false в случае неудачи (каталог уже существует). Таким образом, вы можете просто использовать его как часть своей условной проверки.

if (!is_dir($dir) && mkdir($dir)) {
    // good to go
}
person mister martin    schedule 13.05.2016
comment
я думаю, что это то же самое, что и мой код, за исключением того, что у вас есть mkdir в блоке if, поэтому похоже, что mkdir будет выполняться всегда, разве это не будет каждый раз предупреждать меня? - person J. Doe; 13.05.2016
comment
@J.Doe, это не то же самое, нет. Условие в моем примере не будет генерировать предупреждение, потому что оно задает вопрос (был ли создан каталог?). Ваш не задает вопрос, поэтому выдает предупреждение о том, что не может создать каталог. - person mister martin; 13.05.2016

Вы хотите использовать clearstatcache() в верхней части страницы для тестирования каталога, чтобы системный кеш текущей структуры каталогов был свежим. подробнее читайте здесь

JavaScript для загрузки разбивает файл на несколько частей и отправляет 4 ajax-запроса на php, поэтому php получает 4 части одновременно. когда все части получены, php должен объединить их, чтобы воспроизвести файл на сервере

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

person Martin    schedule 13.05.2016