PHP:如何避免读取通过 FTP 推送给我的部分文件?

标签 php ftp locking

文件正在通过 FTP 推送到我的服务器。我在 Drupal 模块中使用 PHP 代码处理它们。操作系统是Ubuntu,FTP服务器是vsftp。

我会定期检查新文件,使用 SimpleXML 处理它们并将它们移至“完成”文件夹。如何避免处理部分上传的文件?

vsftp 的 lock_upload_files 默认为 yes。我想先尝试移动文件,希望移动在当前上传的文件上失败。这似乎并没有发生,至少在命令行上是这样。如果我开始上传一个大文件并移动,它只会在新位置不断增长。我猜目录项没有被锁定。

我是否应该在尝试加载到 SimpleXML 之前尝试使用模式“a”或“r+”来查看它是否成功,或者是否有更好的方法来执行此操作?我想我只能检测到 SimpleXML 加载失败,但是......这看起来很困惑。

我无法控制发件人。他们不会进行上传和重命名。

谢谢

最佳答案

使用 vsftpdlock_upload_files 配置选项会导致使用 fcntl() 函数锁定文件。这会将咨询锁置于正在上传的文件上。其他程序不需要考虑咨询锁,例如 mv 就不需要。一般来说,咨询锁只是对关心此类锁的程序的建议。 您需要另一个命令行工具,例如 lockrun,它尊重咨询锁。

注意:lockrun 必须使用 WAIT_AND_LOCK(fd) 宏进行编译才能使用 lockf() 而不是 flock () 函数,以便处理 Linux 下由 fcntl() 设置的锁。因此,当使用 lockf() 编译 lockrun 时,它将与 vsftpd 设置的锁配合。

利用这些功能(lockrunmvlock_upload_files),您可以构建一个 shell 脚本或类似的脚本来逐个移动文件,检查如果文件预先被锁定,并且只要文件移动就保持建议锁。如果文件被 vsftpd 锁定,则 lockrun 可以跳过对 mv 的调用,从而跳过正在运行的上传。

关于PHP:如何避免读取通过 FTP 推送给我的部分文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826890/

相关文章:

php - MediaWiki 1.20.0 中如何通过大小写用户名搜索用户贡献?

php - 嵌套在 if 语句中的 MySQL 查询 - PHP

javascript - 如何从 mysql 获取值,返回到前端并在 url 中使用

PHP 延迟加载迭代器

mysql - InnoDB 死锁,锁定模式 S 和 X

linux - wget下载中 "wgetrc"命令的用途是什么

c# - 使用 WinSCP 从 SFTP 位置读取文件内容

c# - 通过 Azure webjobs 从 FTP 服务器获取文件

java - 当 ConcurrentHashMap 调整大小时,读取会如何发生?

mysql - 数据库表的一行上的读锁定