在Windows上从浏览器在后台运行PHP进程
我有点抱歉问这个问题,因为我知道在这里之前已经被问过很多次了,但是我找到的所有答案在我的情况下都不起作用。要么我做了一些根本错误的事情,要么我试图做一些根本不可能的事情 我需要能够从通过web浏览器(由运行在Windows上的Apache web服务器提供)访问的PHP文件中派生出一个后台进程。我需要前台进程完成,因此浏览器停止等待服务器,而分叉进程在后台继续。我使用的是PHP5.3 我尝试了许多建议的解决方案,但都有不同程度的失败:在Windows上从浏览器在后台运行PHP进程,php,Php,我有点抱歉问这个问题,因为我知道在这里之前已经被问过很多次了,但是我找到的所有答案在我的情况下都不起作用。要么我做了一些根本错误的事情,要么我试图做一些根本不可能的事情 我需要能够从通过web浏览器(由运行在Windows上的Apache web服务器提供)访问的PHP文件中派生出一个后台进程。我需要前台进程完成,因此浏览器停止等待服务器,而分叉进程在后台继续。我使用的是PHP5.3 我尝试了许多建议的解决方案,但都有不同程度的失败: shell_exec('D:\php5.3\php.exe
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);
一点也不起作用-尝试分叉新流程时挂起
有人能帮忙吗?我是不是错过了一些很明显的东西
我知道我可以在数据库中对任务进行排队并成批运行,但我需要尽可能接近实时运行,所以我不想通过排队来引入更多延迟,因为我只能每分钟运行一次max。您可以尝试pcntl\u fork函数。这可以派生一个子进程(服务于web页面),同时在后台继续完成剩余的工作。然而,这是需要谨慎使用的东西。只要通读php.net文档,就可以感受到使用这种方法的复杂性。即使这篇文章已经过时,但可能对其他人有用, 这对我来说很有效,花了好几个小时才找到解决方案
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()));
}我认为Windows中没有这个功能?据我所知,它在Apache/webserver环境中非常不可靠?我过去使用过它,但主要用于生成一堆子类来执行负载测试。我严格地处于Linux环境中,所以不知道它是否适用于Windows。