文件正在通过 FTP 推送到我的服务器。我在 Drupal 模块中使用 PHP 代码处理它们。操作系统是Ubuntu,FTP服务器是vsftp。
我会定期检查新文件,使用 SimpleXML 处理它们并将它们移至“完成”文件夹。如何避免处理部分上传的文件?
vsftp 的 lock_upload_files 默认为 yes。我想先尝试移动文件,希望移动在当前上传的文件上失败。这似乎并没有发生,至少在命令行上是这样。如果我开始上传一个大文件并移动,它只会在新位置不断增长。我猜目录项没有被锁定。
我是否应该在尝试加载到 SimpleXML 之前尝试使用模式“a”或“r+”来查看它是否成功,或者是否有更好的方法来执行此操作?我想我只能检测到 SimpleXML 加载失败,但是......这看起来很困惑。
我无法控制发件人。他们不会进行上传和重命名。
谢谢
最佳答案
使用 vsftpd
的 lock_upload_files
配置选项会导致使用 fcntl()
函数锁定文件。这会将咨询锁置于正在上传的文件上。其他程序不需要考虑咨询锁,例如 mv
就不需要。一般来说,咨询锁只是对关心此类锁的程序的建议。
您需要另一个命令行工具,例如 lockrun
,它尊重咨询锁。
注意:lockrun
必须使用 WAIT_AND_LOCK(fd)
宏进行编译才能使用 lockf()
而不是 flock ()
函数,以便处理 Linux 下由 fcntl()
设置的锁。因此,当使用 lockf()
编译 lockrun
时,它将与 vsftpd
设置的锁配合。
利用这些功能(lockrun
、mv
、lock_upload_files
),您可以构建一个 shell 脚本或类似的脚本来逐个移动文件,检查如果文件预先被锁定,并且只要文件移动就保持建议锁。如果文件被 vsftpd
锁定,则 lockrun
可以跳过对 mv
的调用,从而跳过正在运行的上传。
关于PHP:如何避免读取通过 FTP 推送给我的部分文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826890/