如何用PHP非阻塞运行linux终端命令?

时间:2014-02-19 14:27:48

标签: php linux

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

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

3 个答案:

答案 0 :(得分:4)

HACK ALERT,但是如果你不想背景它(比如说你需要对结果做些什么)并且在完成时不关心你可以将命令放在对象的析构函数方法中。请注意,虽然用户将获得他们的响应并可以自由地请求另一个页面,但在完成之前,该过程将不会从Apache或PHP-fpm中释放。

class someClass{

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

注意:在后台处理任务的强大方法是使用使用gearman,rabbitMQ等构建的消息队列和作业服务处理程序。

答案 1 :(得分:2)

Arno van den Brink的exec() PHP文档中的top comment为您提供了答案:

  

这将在后台(没有cmd窗口)执行$ cmd,而无需PHP等待它在Windows和Unix上完成。

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

答案 2 :(得分:1)

听起来您想要在网页上显示du的结果,但不要等待它。这需要ajax调用。

加载您的网页,其中包含div,如:

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

然后onload,通过ajax调用你的du.php,它会运行并返回你的文件用法。然后使用内容更新div。