2010-06-26 49 views
4

可以说我有一个PHP脚本将服务于一个大文件,我目前正在通过FTP上传这个大文件。PHP:如何检查一个文件当前是否正在写入

如果上传完成,我可以检查我的PHP脚本吗?有没有例如一种方式,我可以检查一个文件目前正在写入或类似的东西?

更新:应该提到过这个,但我不是说通过上传脚本上传我正在谈论上传大的PDF文件或通过其他方式如FTP或SFTP等。

+0

如果文件在上传过程中被锁定,试图['flock'](http://de2.php.net/manual/en/function.flock.php)它从PHP返回'FALSE',然后你知道该文件被别的atm使用。 – Gordon 2010-06-26 11:51:58

+0

@戈登:如果脚本是平行运行两次,那意味着即使一个人成功了,另一个人也会失败?要么? – Svish 2010-06-27 10:23:58

+0

如果上传当前正在运行并且FTP对文件有锁定,则两个脚本都会返回false。如果没有上传,并且一个脚本会聚集文件,那么是的,另一个会返回false。 – Gordon 2010-06-27 10:50:29

回答

2

你可以在上传脚本中使用一个有价值的文件(在temportantly目录中),如果上传完成,你可以简单地将文件移动到你的最终位置,文件名称很好。

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

对于获得temportantly文件(环境无关)使用PHP函数:

resource tmpfile (void) 

Documemtation它你可以在http://pl.php.net/manual/en/function.tmpfile.php 这个函数返回找到手柄到新的干净的临时文件。

但是,如果您使用此功能,则必须在关闭句柄之前复制文件,因为当您拨打fclose(handle)时删除了该文件。为了得到文件缓冲区的保证是干净的,你可以在结束时致电fflush(handle)


或者如果你不想使用tmpfile(void)函数,你可以做这个manualy。

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

相关问题