Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows上从浏览器在后台运行PHP进程_Php - Fatal编程技术网

在Windows上从浏览器在后台运行PHP进程

在Windows上从浏览器在后台运行PHP进程,php,Php,我有点抱歉问这个问题,因为我知道在这里之前已经被问过很多次了,但是我找到的所有答案在我的情况下都不起作用。要么我做了一些根本错误的事情,要么我试图做一些根本不可能的事情 我需要能够从通过web浏览器(由运行在Windows上的Apache web服务器提供)访问的PHP文件中派生出一个后台进程。我需要前台进程完成,因此浏览器停止等待服务器,而分叉进程在后台继续。我使用的是PHP5.3 我尝试了许多建议的解决方案,但都有不同程度的失败: shell_exec('D:\php5.3\php.exe

我有点抱歉问这个问题,因为我知道在这里之前已经被问过很多次了,但是我找到的所有答案在我的情况下都不起作用。要么我做了一些根本错误的事情,要么我试图做一些根本不可能的事情

我需要能够从通过web浏览器(由运行在Windows上的Apache web服务器提供)访问的PHP文件中派生出一个后台进程。我需要前台进程完成,因此浏览器停止等待服务器,而分叉进程在后台继续。我使用的是PHP5.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);
一点也不起作用-尝试分叉新流程时挂起

有人能帮忙吗?我是不是错过了一些很明显的东西


我知道我可以在数据库中对任务进行排队并成批运行,但我需要尽可能接近实时运行,所以我不想通过排队来引入更多延迟,因为我只能每分钟运行一次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。