【问题标题】:Run long SAS stored proc from php without hanging browser从 php 运行长 SAS 存储过程而不挂起浏览器
【发布时间】:2016-09-22 14:26:57
【问题描述】:

我需要调用一个 SAS 存储过程,它需要大约 5 分钟才能运行,而不会挂断我的浏览器。我正在使用 Yii 堆栈并通过 url 调用 SAS。我会附上代码,但老实说,此时我已经尝试了很多东西,以至于我的代码版本已经没有任何意义了。任何方向将不胜感激。

注意:我已经尝试过 exec() ,但这似乎不起作用。我已经尝试过 ajax,并且更喜欢异步 ajax 调用,但在这一点上我会尝试任何事情。如果需要任何其他信息,请告诉我。

更新:我在 php 中创建了一个控制器操作,如果我直接进入浏览器 url 中的控制器操作,它会成功完成存储过程。但是,如果我使用 ajax get 调用该控制器操作,则存储过程不会执行。

【问题讨论】:

  • 如果我的回答不合适(例如,您需要基于 URL 的参数并且无法编辑您的 STP),请发布您使用 ajax 的尝试。
  • 我对您使用 PHP 感到困惑 - 您是从客户端浏览器还是 PHP 服务器调用 SAS 存储过程?

标签: php ajax linux yii sas


【解决方案1】:

如果您从 php 成功调用 SAS 存储过程,那么您只需要从 javascript 异步调用您的 php 服务。

$.ajax({
    type: "POST",
    url: url + '&_action=background',
    data: data, // additional parameters 
    async:true,
    success: function(response){  
     alert(response); 
     // all code here will execute AFTER the PHP/STP is finished
    }
});
// all code here will execute immediately 

感谢@angel

编辑:按照@quentin 的建议将 _action=background 添​​加到 URL 中

【讨论】:

  • 问题在于 ajax 调用等待 SAS 进程完成。如果我尝试离开页面,它会切断显然停止脚本的 ajax 调用。对我来说没有意义,所以我知道我错过了一些东西。
  • 另外,它挂在页面上。我无法离开。它只是旋转直到过程完成。
  • @JonSkinner 如果他们离开,脚本停止有什么问题?如果不再次运行,则无法在该点返回结果。
  • 可能结果正在其他地方写入。我还遇到了 STP 停止服务器端的问题,这涉及到负载平衡选项的一些摆弄。
  • @RawFocus 是对的,正在其他地方编写 pdf 文档。这个想法是我将有一个看门狗脚本,它会发送一个警告,表明 pdf 已完成处理并且用户可以下载。我猜由于 php 是单线程的,也许整个堆栈都被锁定以等待 SAS 进程完成?但这真的没有意义,因为我假设 php 控制器不需要发回响应。
【解决方案2】:

ajax 应该可以正常工作!您甚至可以尝试使用 SASjs javascript library。有关website 的更多详细信息。示例代码 - 一旦配置 - 如下:

var adapter = new SASjs.default({
     appLoc: "/SASFolder/appLocation"
    ,serverType:"SAS9"
}); // Can be SAS9 or Viya

var dataObj = {tableName: [{ colName: 'colValue' }]}; // can be null
adapter.request('/subfolder/servicename',dataObj)
.then((response) => {
  //we just submitted a request, now deal with response
  alert(response);
  // all code here will execute AFTER the STP / JES is finished
});
// all code here will execute immediately 

【讨论】:

  • 让我试着说清楚一点,抱歉。我正在使用 ajax 调用进行 SAS 调用的 php 控制器。我这样做的原因是使用 ajax 调用 SAS url 会给我一个 CORS 错误,我很确定会在 SAS 进程运行时挂断我的浏览器。我错了吗?我在 url 字符串中使用参数。
  • 它不一定会挂起您的浏览器,但如果 SAS Web 服务器未提供该页面,则会出现 CORS 问题。您可以将您的域添加为例外吗?或者禁用同源策略进行测试?恐怕我无法在 php 方面提供帮助。但无论哪种方式,在我看来,您只需将整个事情包装在一个事件处理程序中(在浏览器中,使用 javascript)。如果您可以添加一个新问题,展示您尝试过的内容(ajax 方式),那么我认为您会从该领域得到更好的回应..
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2016-08-16
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多