我需要在用户操作时执行目录复制,但目录相当大,因此我希望能够在用户不知道完成复制所需时间的情况下执行这样的操作。
任何建议都将不胜感激。
我需要在用户操作时执行目录复制,但目录相当大,因此我希望能够在用户不知道完成复制所需时间的情况下执行这样的操作。
任何建议都将不胜感激。
当前回答
您可以尝试像Resque这样的排队系统。然后,您可以生成一个作业,该作业处理信息并快速返回“处理”图像。使用这种方法,你不知道什么时候完成。
此解决方案适用于规模较大的应用程序,在这些应用程序中,您不希望前端机器承担繁重的工作,因此它们可以处理用户请求。 因此,它可能适用于文件和文件夹等物理数据,也可能不适用,但对于处理更复杂的逻辑或其他异步任务(如新的注册邮件),它是很好的,而且具有很强的可伸缩性。
其他回答
您可以尝试像Resque这样的排队系统。然后,您可以生成一个作业,该作业处理信息并快速返回“处理”图像。使用这种方法,你不知道什么时候完成。
此解决方案适用于规模较大的应用程序,在这些应用程序中,您不希望前端机器承担繁重的工作,因此它们可以处理用户请求。 因此,它可能适用于文件和文件夹等物理数据,也可能不适用,但对于处理更复杂的逻辑或其他异步任务(如新的注册邮件),它是很好的,而且具有很强的可伸缩性。
您是否可以安排派生一个单独的进程,然后在后台运行您的副本?我已经有一段时间没有使用PHP了,但是函数pcntl-fork看起来很有前途。
用任何方便的语言(php/bash/perl/etc)将进程作为服务器端脚本编写,然后从php脚本中的进程控制函数调用它。
该函数可能会检测是否使用标准io作为输出流,如果是,则设置返回值,如果不是,则结束
proc_close( proc_open( "./command --foo=1 &", array(), $foo ) );
我在命令行中使用“sleep 25s”作为命令快速测试了这个功能,效果非常好。
(答案在这里)
假设这是在Linux机器上运行的,我总是这样处理它:
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
这将启动命令$cmd,将命令输出重定向到$outputfile,并将进程id写入$pidfile。
这使您可以轻松地监视进程正在做什么以及它是否仍在运行。
function isRunning($pid){
try{
$result = shell_exec(sprintf("ps %d", $pid));
if( count(preg_split("/\n/", $result)) > 2){
return true;
}
}catch(Exception $e){}
return false;
}
PHP脚本不同于其他桌面应用程序开发语言。在桌面应用程序语言中,我们可以设置守护线程来运行后台进程,但在PHP中,当用户请求一个页面时,进程就会发生。但是,可以使用php脚本运行的服务器的cron作业功能来设置后台作业。