我想设计一个用户可以提交文件的系统。提交文件后,我将运行一些文件脚本。我想按顺序运行这些文件,所以我想维护一个请求队列。我怎么能用PHP做到这一点?是否有任何开源库?
谢谢!
答案 0 :(得分:-1)
我会使用数据库..
答案 1 :(得分:-1)
我会使用Redis。 Redis是一种超快的键值存储;通常它的响应时间是两位数微秒。 (10 - 99微秒)
Redis事务是原子的(事务发生或不事件),你可以在不使用cron的情况下不断运行。
要将Redis与PHP一起使用,您可以使用Predis。
安装redis后,Predis设置为使用您的脚本,在上传文件后我会做这样的事情:
// 'hostname' and 'port' is the hostname and the port
// where Redis is installed and listening to.
$client = new Predis\Client('tcp://hostname:port');
// assuming the path to the file is stored in $pathToFile
$client->lpush('queue:files', $pathToFile);
然后需要处理文件的脚本,只需要执行以下操作:
$client = new Predis\Client('tcp://hostname:port');
// assuming the path to the file is stored in $pathToFile
while(true){
$pathToFile = $client->rpop('queue:files');
if(!$pathToFile) {
// list is empty, so move on.
continue;
}
// there was something in the list, do whatever you need to do with it.
// if there's an exception or an error, you can always use break; or exit; to terminate the loop.
}
考虑到PHP往往会占用大量内存,因此我会明确地收集垃圾(随时随地通过gc_enable()
和gc_collect_cycles()
以及unset()
变量。) / p>
或者,您可以使用supervisord
等软件使此脚本只运行一次,一旦结束,再次启动它。
一般情况下,我会远离使用数据库和cron来实现队列。它可能导致严重的问题。
例如,假设您使用表作为队列。
在第一次运行中,您的脚本从数据库中提取作业并开始执行其操作。
然后由于某种原因,您的脚本需要更长的时间才能运行,并且cron作业再次启动,现在您有2个脚本处理同一个文件。这可能没有后果,也可能产生严重后果。这取决于您的应用程序实际执行的操作。
因此,除非你正在使用一个非常小的数据集,并且你确定你的cronjob会在前一个脚本运行之前完成,并且不会发生冲突,那么你应该没问题。否则,远离那种方法。