PHP: Как проверить, записывается ли файл в данный момент - PullRequest
4 голосов
/ 26 июня 2010

Допустим, у меня есть PHP-скрипт, который будет обслуживать большой файл, и в настоящее время я загружаю этот большой файл, например, по FTP.

Есть ли способ проверить в своем PHP-скрипте, еслизагрузка завершена?Например, есть ли способ проверить, записывается ли файл в данный момент или что-то в этом роде?

Обновление: Я должен был упомянуть об этом раньше, но я не говорю о загрузкес помощью сценария загрузки, о котором я говорю, например, для загрузки больших файлов PDF или с помощью других средств, таких как FTP или SFTP.

Ответы [ 2 ]

2 голосов
/ 26 июня 2010

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

Это общее решение этой проблемы.

Для получения временного файла (независимого от среды) используйте функцию PHP:

resource tmpfile ( void )

Документация для этого вы можете найти на http://pl.php.net/manual/en/function.tmpfile.php Эта функция возвращает дескриптор вашего нового чистого временного файла.

Но если вы используете эту функцию, вы должны скопировать файл перед закрытием дескриптора, потому что этот файл был удален при вызове fclose(handle). Чтобы убедиться, что файловый буфер очищен, вы можете в конце вызова fflush(handle).


Или, если вы не хотите использовать функцию tmpfile(void), вы можете сделать это вручную.

string tempnam ( string $dir, string $prefix )

Префикс - это префикс к вашим файлам, позволяющий легко сгруппировать ее для удаления или чего-то еще. Вызовите эту функцию, чтобы получить уникальный файл в типизированном каталоге, так как каталог содержит временный каталог в вашей среде, вы можете получить это, вызвав:

string sys_get_temp_dir ( void )

Затем, когда у вас есть самоконтроль, запишите в него данные для загрузки и закройте. Скопируйте этот файл в ваше окончательное местоположение, используя:

bool copy ( string $source, string $dest [, resource $context ] )

И удалите свой временный файл, чтобы очиститься в своей среде:

bool unlink ( string $filename [, resource $context ] )
0 голосов
/ 26 июня 2010

Вы не говорите, в какой ОС вы работаете, но если вы работаете в Unix-подобной системе, вы можете использовать fuser, чтобы увидеть, кто в данный момент использует файл. Есть handle, который делает эквивалентную сторону Windows.

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