0

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

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

在这个主页上,我想要一个可以启动我的 php 命令的 url

<?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”);
}
});}

我试过上面的代码没有运气。

4

2 回答 2

7

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

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

此作业的运行不能与 Web 请求同步完成。它必须异步运行

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

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

于 2013-07-05T20:04:59.003 回答
0

虽然其他答案是正确的,并且 WWW 不适合开放请求,但我们必须考虑 www 从来没有“打算”获取信息

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

此外,我的问题很简单,我如何用结果 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 应用程序的其余部分可以继续工作。

于 2013-07-07T01:47:54.967 回答