phpexec,并运行bash脚本直到它完成


php exec and running a bash script until its finished

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

我有一个网络前端,使它易于使用。

在这个主页上,我想有一个url,我按下它来启动我的php命令

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

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

setcookie('status',"done");

这一切都很容易完成,并且可以正常工作。然而,加载我的exec命令的url是一个空白的白色页面。我不想要这个。我希望url是一个操作,它启动我的phpscript,并在exec命令在后台返回所有内容时设置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”);
}
});}

我尝试过上面的代码,但没有成功。

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

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

此作业的运行无法与web请求同步完成。它必须异步运行。

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

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

虽然另一个答案是正确的,WWW不适用于打开请求,但我们必须考虑到WWW从来就不是用来获取信息的。

作为程序员,我们让它获取诸如登录之类的信息。

此外,我的问题很简单,我如何将行动A与结果B结合起来。虽然正如@symcbean的另一篇帖子所建议的那样,发送和发送电子邮件会很好,但这不是一个解决方案,而是一个回避问题的方法。

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

这是我的解决方案:

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

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

一旦它这样做了,它就会设置我的cookie,我的网络应用程序的其余部分就可以继续工作了。