从 Dropbox 为数百名用户处理数千个文件的最佳方式


Best way to process thousand of files for hundreds of users from Dropbox

在基于 PHP 的网站上,用户将允许 Dropbox 应用程序使用他们的 Dropbox 文件夹,然后用户将数千个文本文件放入此文件夹中,也许一次,也许连续,我需要处理,保存到数据库并在用户登录网站时尽快显示结果(我想近乎实时地处理和输出它)。用最少的资源做到这一点的最佳技术是什么?首先,我需要为 30 个人做这件事,但后来它必须立即与数百名用户一起工作。每个用户将有数千个文件,有些文件需要处理不止一次(它们正在增加),而其他文件则不需要。

我坚持在无限循环中运行命令行php脚本,该脚本从Dropbox复制并定期为每个用户处理文件,但似乎太慢了。对Dropbox服务器的API调用似乎非常慢,因此连续调用可能不是最佳选择。
更好的办法可能是用户单击网站上的"导入"按钮,并且脚本仅获取当前单击该按钮的用户的文件。
你有什么建议?它不一定是PHP。我有一个专用的服务器,但我也想听到托管友好的解决方案。

也许为我提供了一种简单,安全且快速的方法,可以将这些文件作为Dropbox方法发送到服务器。(我选择这样做,因为Dropbox对于用户来说非常容易设置和使用,同步非常可靠,安全和快速。

如果你安装了 GNU Parallel http://www.gnu.org/software/parallel/,你可以让它保持运行:

inotifywait -q -m -r -e MOVED_TO -e CLOSE_WRITE --format %w%f Dropbox_dir | parallel -u your_program

每次将某些内容上传到低于Dropbox_dir的任何目录时,your_program将在该文件上运行。 parallel将确保每个 CPU 内核仅运行 1 个作业,因此如果用户一次性上传 10000 个文件,您的服务器不会过载。

对于每个用户,您只需执行以下操作:

mkdir Dropbox_dir/user_folder

并等待 Dropbox 将文件放入其中。

由于 Dropbox 使用的是.dropbox.cache.dropbox因此可能需要忽略路径中包含该文件的文件:

inotifywait ... | grep -v /.dropbox | parallel ...

这也适用于其他文件传输方法(FTP/Samba/Rsync/scp以及可能更多)。

您可以通过以下方式安装 GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

观看 GNU 并行的介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1