2012-07-30 42 views
0

我有点遗憾地问这个问题,因为我知道在此之前已经询问了很多次,但是我发现的所有答案都不适用于我的情况。要么我正在做一些根本性错误的事情,要么我正在尝试做一些不可能的事情。从Windows的浏览器在后台运行PHP进程

我需要能够从通过Web浏览器访问的PHP文件(由运行在Windows上的Apache Web服务器提供服务)分离后台进程。我需要前台进程完成,因此浏览器停止等待服务器,而分叉进程在后台继续。我正在使用PHP 5.3。

我已经试了无数建议的解决方案都具有不同的失败程度:

shell_exec('D:\php5.3\php.exe sleep.php > out 2>out2'); 

无论是通过运行命令行,或通过浏览器,前台进程没有完成,直到后台一个没有。添加在年底“&”似乎没有任何区别

pclose(popen("start D:\php5.3\php.exe sleep.php","r")); 

这一个细微的工作,通过命令行,但是当通过浏览器访问,它等待前台和后台进程来完成。

exec("nohup D:/php5.3/php.exe -f sleep.php > out 2>out2"); 

这似乎并没有在所有

$commandString = "start /b D:/php5.3/php.exe d:\\webroot\\other\\tests\\sleep.php"; 
pclose(popen($commandString, 'r')); 

在命令行努力工作,等待在浏览器

$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("D:/php5.3/php-win.exe -f d:\\webroot\\other\\tests\\sleep.php", 0, false); 

都没有工作 - 努力叉时挂新的过程。

任何人都可以帮忙吗?我错过了一些非常明显的东西?!

我知道我可以将任务放在数据库中并批量运行,但我需要尽可能接近实时地运行,因此不想通过将事情排入队列来引入更多延迟每分钟只能运行一次。

回答

0

您可以尝试pcntl_fork函数。这可以在继续执行后台工作中的其余工作的同时分叉子进程(为网页提供服务)。然而,这是需要谨慎使用的。只需阅读php.net文档即可了解使用此方法的一些复杂性。

+0

我不认为在Windows中可用?从我读过的文章来看,它在Apache/Web服务器环境中非常不礼貌? – Mayb2Moro 2012-07-30 20:53:29

+0

我过去曾经使用它,但主要是为了产生一堆儿童班来执行负载测试。我严格在Linux环境中,所以不知道它适用于Windows。 – 2012-07-30 20:56:54

0

即使这篇文章已过时,但可能对别人有用, 这对我很有用,花了几个小时才找到解决方案!

function execInBack($phpscript, $args = array(), $logfile = '', $stdoutfile = '') { 
if (count($args) == 0) { 
    $args[] = md5(mt_rand()); 
} 

$arg = ''; 

foreach ($args as $a) { 
    $arg .= "\"$a\" "; 
} 

$cmd = "start /b c:\php\php5.3.10\php.exe ./$phpscript $arg"; 
$p = array(); 

$desc = array(); 
if ($logfile && $stdoutfile) { 
    $desc = array(
     1 => array("file", $stdoutfile, "w"), 
     2 => array("file", $logfile, "a") 
    ); 
} 

proc_close(proc_open($cmd, $desc, $p, getcwd())); 

}