在基于PHP的网站上,用户将授权Dropbox应用程序使用其Dropbox文件夹,然后用户将数千个文本文件放在此文件夹中,可能是一次,也许是连续的,我需要处理,保存到数据库并在用户登录网站时尽快显示结果(我希望几乎实时处理并输出)。 使用最少的资源来实现这一目标的最佳技术是什么?首先,我需要为30人做这件事,但后来它必须立即与数百名用户合作。每个用户将拥有数千个文件,而某些文件需要处理多次(它们正在增加),而其他文件则不需要处理。
我试着在无限循环中运行一个命令行php脚本,它会定期从Dropbox复制并为每个用户处理文件,但它似乎太慢了。对Dropbox服务器的API调用似乎非常慢,因此连续执行它可能不是最佳选择 用户可以更好地点击网站上的“导入”按钮,脚本只会获取当前点击该按钮的用户的文件。也许为我提供另一种简单,安全,快捷的方法,将这些文件作为Dropbox方法提供给服务器。 (我选择这样做,因为Dropbox非常容易设置,使用,同步非常可靠,安全和快速。)
答案 0 :(得分:1)
如果你安装了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 Parallel的介绍视频了解详情: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1