2014-02-19 127 views
2

假设我想在PHP表单上通过我的网页运行服务器端命令。命令是du -hs,可能需要几分钟才能完成。我可以以某种方式使用exec()或shell_exec(),以便网页立即重新加载并且不会等待命令的输出?一个例子会很棒!谢谢!如何用PHP非阻塞运行linux终端命令?

<?php 
    exec('du -hs'); 
?> 
+2

这将['EXEC()'文档】在被识别(http://us3.php.net/manual/en/function.exec.php)下的拳头警告部分权利。 _如果一个程序以这个函数启动,为了继续在后台运行,程序的输出必须被重定向到一个文件或另一个输出流。否则会导致PHP挂起,直到程序执行结束。查看'symfony/process'。# –

+0

查看'symfony/process'。没有必要重新发明轮子。 – KingCrunch

+0

这是你的答案 http://stackoverflow.com/questions/3819398/php-exec-command-or-similar-to-not-wait-for-result – manan

回答

4

HACK警惕,但如果你不想背景,(说你需要做的,结果东西),当它完成,你可以在一个析构函数方法把命令不在乎目的。请注意,虽然用户将得到他们的回应并可以自由地请求另一个页面,但在完成之前,该流程不会从Apache或PHP-fpm中释放。

class someClass{ 

     function __destruct(){ 
      exec('du -hs'); 
     }  
} 

注:可靠的方法来处理后台任务是使用消息队列和就业服务处理器打造出与Gearman的,RabbitMQ的,或者这样的。

+0

我从来没有听说过这个,我很高兴你添加了HACK ALERT。这有点吓人但也很聪明,一定要在代码中广泛评论它! –

+0

@MichaelBerkowski我这样做是为了避免使用作业队列服务器将用户数据发送到我的电子邮件web服务来发送欢迎邮件,这可能需要一秒左右,但我不希望用户等待一次他们注册 – Ray

+0

@Ray非常有趣的黑客攻击,但是有没有这样一种情况,比重定向命令的输出更受欢迎?如果是这样,你应该将它添加到你的答案中 – FtDRbwLXw6

1

这听起来像你想在网页上显示du的结果,但不要等待它。这将需要ajax呼叫。

载入您的网页,其中包含一个div,如:

<div id="du-div">Calculating filespace...</div> 

然后onload事件,通过这将运行并返回您的文件使用Ajax调用你的du.php。然后你更新你的div与内容。

2

由阿诺凌科的PHP文档exec()上的top comment给你答案:

这将不PHP执行$ cmd在背景(无cmd窗口),等待它完成,上Windows和Unix。

<?php 
function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 
?>