php exec并运行bash脚本直到完成

时间:2013-07-05 18:20:28

标签: php shell

我有一个bash脚本可能需要几个小时才能完成。

我有一个网页前端,方便使用。

在这个主页面上,我想要一个我按下的URL来启动我的php命令

<?exec('myscript that take a long time');?>

exec完成后,我希望它加载一个cookie。

setcookie('status',"done");

这一切都很容易完成并按原样运行。但是,加载我的exec命令的URL是一个空白页面。我不想要这个。我希望url是一个动作,它启动我的phpscript并在exec命令在后台返回all时设置cookie。

这可能吗?

如果没有,我可以接近这种行为。

修改

function foo(){

var conn = new Ext.data.Connection();
conn.request({
url:‘request.php’,
method:‘POST’,
success: function(responseObject) {
    alert(“Hello,Word!”);
},
failure: function() {
alert(“Something fail”);
}
});}

我没试过上面的代码。

2 个答案:

答案 0 :(得分:7)

  

我有一个bash脚本可能需要几个小时才能完成

停在那里。那是你的第一个问题。 WWW的设计目的不是维持开放请求超过几分钟。也许有一天(因为我们现在有了websockets),但即使你知道如何配置你的网络服务器,所以这对于任何一个路过的人来说都不是一个开关,所以中间的网络或你的浏览器不太可能愿意等待这个长。

无法与Web请求同步运行此作业。它must be run asynchronously

无论如何都要从网页上轮询作业的状态(通过元刷新或ajax),但是我很难理解在完成cookie时设置cookie的好处;通常对于这样的事情,我会在任务结束时发送一封电子邮件。您还需要一种方法来分离出这样调用的并发任务,或者确保一次只运行一个任务的方法。

一种解决方案是将PHP会话ID作为参数传递给脚本,然后让脚本在完成时编写一个以会话ID命名的文件 - 或者甚至通过文件提供部分更新 - 然后您的网页可以进行轮询使用会话ID的作业状态。当然,您的代码应该在开始新作业之前检查作业的实例是否已经运行。

答案 1 :(得分:0)

虽然其他答案是正确的并且WWW不适用于公开请求,但我们必须考虑www从未“意味着”to take information

作为程序员,我们使用了登录等信息。

此外,我的问题很简单,我如何将结果B的行动A提交。虽然发送和发送电子邮件会很好,而且正如@symcbean提出的其他帖子所说的那样,它不是解决方案,而是对问题的回避。

Web应用程序通常需要与Web服务器通信以更新其状态。这是矛盾的,因为websterver是无国籍的。饼干是灵魂。

这是我的解决方案:

$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});
setcookie('status',"done");

url是一个php函数页面,if语句充当switch语句并运行我的外部脚本需要很长时间。这个调用是阻塞的,也就是说,在完成之前它不会执行setcookie。

一旦这样做,它将设置我的cookie,我的其余web应用程序可以继续工作。