Получите PHP, чтобы дождаться завершения передачи файла перед его перемещением - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть PHP-скрипт, который перемещает файлы из определенной папки на сервере (IBM AS400). Проблема, с которой я сталкиваюсь, заключается в том, что иногда сценарий запускается, пока файл находится в процессе перемещения в папку.

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

Я думал, что смогу сделать это:

$oldModifyTime = filemtime('thefile.pdf');
sleep(2);
if($oldModifyTime === filemtime('thefile.pdf'){
  rename('thefile.pdf','/folder2/thefile.pdf');
}

Но функции filemtime имеют одно и то же значение даже во время записи файла. Я также пробовал fileatime с теми же результатами.

Если я сделаю Правый клик-> Свойства в Windows, Дата изменения и Дата доступа постоянно изменяются во время записи файла.

Есть какие-нибудь идеи, как определить, завершен ли перенос файла, прежде чем что-либо делать с ним?

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Из справочника PHP для filemtime():

Примечание: Результаты этой функции кэшируются. Подробнее см. clearstatcache().


Я бы также предположил, что 2 секунды немного меньше, чтобы определить, завершена ли передача файла из-за перегрузки сети, буферизации и т. Д.

1 голос
/ 19 декабря 2011

Передайте его как временное имя или в другую папку, затем переименуйте / скопируйте его в нужную папку после завершения передачи.

...