2012-01-30 50 views
0

我有一个PHP脚本,执行大量的检查,然后将文件下载到服务器并输出原件。
要下载的文件我用异步PHP?

system("/usr/local/bin/wget -O ..."); 

所以PHP等待下载完成,然后它输出的文件。
我的问题是如果它可能发送一个“ping”的地方(其他php文件?)下载启动,然后不等待结果只是继续执行。

+0

做这个帮助http://stackoverflow.com/questions/1296085/download-file-using-jquery? – 2012-01-30 10:08:09

+0

不,对不起。 jQuery在此无所事事 – Jim 2012-01-30 10:09:54

回答

1

使用pcntl_fork()将当前进程分叉到子进程中。在父进程可以继续执行其任务时,在子进程中执行文件下载。

$pid = pcntl_fork(); 

if ($pid == -1) 
{   
    // Fork failed    
    exit(1); 
} 
else if ($pid) 
{ 
    // The parent process 
    //continue what you want to do here 
} 
else 
{ 
    // the child process 
    // do the system call here 
} 

做了一些工作后,如果您现在需要父进程等到子进程结束时,可以pcntl_waitpid($pid)

有关pcntl方法的更多文档,请阅读here

+0

pcntrl函数不建议在Web环境中使用,只能在* nix系统上使用 - http://uk.php.net/manual/en/intro.pcntl.php – 2012-01-30 10:07:39

+0

由于他标记了问题linux,我认为我们可以安全地假设他在Linux机器上运行它。至于你的其他观点,你是对的。 Pcnlt函数只能从CLI运行。 – xbonez 2012-01-30 10:09:13

+0

仍然“不推荐在网络环境中使用” - 因为这会在最糟糕的时刻崩溃并烧掉。 – Piskvor 2012-01-30 10:13:48

2

使用curl_multi_*函数可以并行处理多个下载。 PHP缺乏任何类型的线程支持,而分叉仅仅是一种破解。

+0

我没有多次下载,该文件只有一个。我只想在文件下载时继续执行。 – Jim 2012-01-30 13:44:09

0

总体设计patters将应用命令设计模式:http://en.wikipedia.org/wiki/Command_pattern

你可以在你的本地网络环境中实现,或者你可以安装某种队列服务器,如:http://www.rabbitmq.com/等等,等等

这取决于你的系统,访问他们和你的知识,看看哪个解决方案最适合这是一个更复杂的问题,太离谱了。

一般来说,建议图案可以让你解决你的问题,而无需大量的问题,因为它是一个众所周知的和广泛使用的方法来处理大量的这要花很长时间的请求中直接做任务。