2024-07-28 05:00:06

PHP执行后台进程

我需要在用户操作时执行目录复制,但目录相当大,因此我希望能够在用户不知道完成复制所需时间的情况下执行这样的操作。

任何建议都将不胜感激。


当前回答

用任何方便的语言(php/bash/perl/etc)将进程作为服务器端脚本编写,然后从php脚本中的进程控制函数调用它。

该函数可能会检测是否使用标准io作为输出流,如果是,则设置返回值,如果不是,则结束

proc_close( proc_open( "./command --foo=1 &", array(), $foo ) );

我在命令行中使用“sleep 25s”作为命令快速测试了这个功能,效果非常好。

(答案在这里)

其他回答

对于我们这些使用Windows的人来说,看看这个:

参考:http://php.net/manual/en/function.exec.php # 43917

我也曾试图在后台运行一个程序 当脚本继续执行时,Windows。这种方法不像 其他解决方案允许您启动任何程序最小化,最大化, 或者根本就没有窗户。llbra@phpbrasil的解决方案确实有效,但它 有时会在桌面上产生一个不需要的窗口 希望隐藏任务运行。

在后台最小化启动Notepad.exe:

<?php 
$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("notepad.exe", 7, false); 
?> 

在后台启动一个shell命令:

<?php 
$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("cmd /C dir /S %windir%", 0, false); 
?> 

启动MSPaint maximized,等待你关闭它,然后继续脚本:

<?php 
$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("mspaint.exe", 3, true); 
?> 

有关Run()方法的更多信息,请访问: http://msdn.microsoft.com/library/en-us/script56/html/wsMthRun.asp

编辑网址:

请访问https://technet.microsoft.com/en-us/library/ee156605.aspx,因为上面的链接已经不存在了。

我知道这是一个有100年历史的帖子,但不管怎样,我觉得它可能对某人有用。你可以在页面的某个地方放一个不可见的图像,指向需要在后台运行的url,就像这样:

<img src="run-in-background.php" border="0" alt="" width="1" height="1" />

感谢这个答案:Symfony process Component是运行后台进程的一个完美工具,它基于proc_*函数,但是使用起来更容易。有关更多信息,请参阅其文档。

用任何方便的语言(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;
}