可以说我有一个PHP脚本将服务于一个大文件,我目前正在通过FTP上传这个大文件。PHP:如何检查一个文件当前是否正在写入
如果上传完成,我可以检查我的PHP脚本吗?有没有例如一种方式,我可以检查一个文件目前正在写入或类似的东西?
更新:应该提到过这个,但我不是说通过上传脚本上传我正在谈论上传大的PDF文件或通过其他方式如FTP或SFTP等。
可以说我有一个PHP脚本将服务于一个大文件,我目前正在通过FTP上传这个大文件。PHP:如何检查一个文件当前是否正在写入
如果上传完成,我可以检查我的PHP脚本吗?有没有例如一种方式,我可以检查一个文件目前正在写入或类似的东西?
更新:应该提到过这个,但我不是说通过上传脚本上传我正在谈论上传大的PDF文件或通过其他方式如FTP或SFTP等。
你可以在上传脚本中使用一个有价值的文件(在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 ])
如果文件在上传过程中被锁定,试图['flock'](http://de2.php.net/manual/en/function.flock.php)它从PHP返回'FALSE',然后你知道该文件被别的atm使用。 – Gordon 2010-06-26 11:51:58
@戈登:如果脚本是平行运行两次,那意味着即使一个人成功了,另一个人也会失败?要么? – Svish 2010-06-27 10:23:58
如果上传当前正在运行并且FTP对文件有锁定,则两个脚本都会返回false。如果没有上传,并且一个脚本会聚集文件,那么是的,另一个会返回false。 – Gordon 2010-06-27 10:50:29