PHP:如何检查文件是否正在被写入

4
假设我有一个PHP脚本要提供一个大文件,而我目前是通过FTP上传这个大文件。请问在我的PHP脚本中是否有一种方法可以检查上传是否完成?例如,是否有一种方法可以检查文件是否正在被写入等等?
更新:之前应该提到,我不是指通过上传脚本上传,我是指通过其他方式(如FTP或SFTP)上传大型PDF文件等。

如果在上传过程中文件被锁定,尝试从PHP使用flock(http://de2.php.net/manual/en/function.flock.php)进行锁定应该会返回`FALSE`,这时你就知道文件正在被其他程序使用。 - Gordon
@Gordon:如果脚本在两个并行进程中运行,那么即使其中一个成功了,另一个也会失败吗?还是说呢? - Svish
如果上传正在运行且FTP锁定了文件,则两个脚本都将返回false。如果没有上传并且一个脚本锁定了文件,则另一个脚本将返回false。 - Gordon
2个回答

2

您可以在上传脚本中使用一个临时文件(在临时目录中),如果上传完成,您可以将文件简单地移动到最终位置并设置好文件名。

这是解决此问题的常见方案。

要获取临时文件(与环境无关),请使用 PHP 函数:

resource tmpfile ( void )

您可以在http://pl.php.net/manual/en/function.tmpfile.php找到相关的it技术文档。

使用此函数时,您需要在关闭句柄之前复制文件,因为当您调用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

您没有说明您使用的操作系统,但如果您使用的是类Unix系统,您可以使用fuser命令查看当前正在使用文件的用户。在Windows系统中,有一个等效的命令handle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接