首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >停止请求服务器端

停止请求服务器端
EN

Stack Overflow用户
提问于 2014-01-17 19:21:14
回答 3查看 3.1K关注 0票数 0

我有一个名称查找框,它由您典型的ajax请求操作。以下是每次按信时触发Javascript的一般流程:

  • 如果ajax请求已经打开,则中止它。
  • 如果超时已经创建,则销毁它。
  • 将新的超时设置为在半秒钟内运行以下内容:
  • 通过ajax将字符串发送到“nameLookup.php”
  • 等待回应
  • 显示结果

问题是nameLookup.php资源非常多。在某些情况下,将从SQL数据库中提取多达10,000个名称,对其进行解密,并与字符串进行比较。在正常情况下,请求可以在任何地方从5到60秒内返回。

我完全理解,当您在客户端中止请求时,服务器仍在处理一些事情,并将结果发回。只有客户端知道如何忽略响应。但是服务器正在忙于处理所有这些请求。

所以如果你这么做了:

  • 请求1
  • 中止请求1
  • 请求2
  • 中止请求2
  • 请求3
  • 等待请求3的响应

在完成1和2之前,服务器甚至不能处理请求3.或者,请求3需要很长时间才能完成请求1和请求2的工作。

我需要知道如何告诉服务器停止处理请求1和2,这样我就可以释放资源让它处理请求3。

我在客户端使用Javascript & jQuery。服务器端的PHP/Apache和SQL。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-17 22:42:14

我想出了一个很棒的解决方案,我已经测试过了,而且效果很好。这只是几行PHP代码,用于输入任何资源密集型的文件。

此解决方案利用来自服务器的进程标识符(PID)。我们可以使用两个PHP函数: posix_getpid()来获取当前PID,而posix_kill()则可以杀死另一个PID。这还假设您已经在其他地方调用了session_start()。

下面是代码:

代码语言:javascript
运行
复制
//if any existing PIDs to kill, go through each
if ($_SESSION['pid']) foreach ($_SESSION['pid'] as $i => $pid) {

    //if posix_kill returns true, unset this PID from the session so we don't waste time killing it again
    if(posix_kill($pid,0)) unset($_SESSION['pid'][$i]);

}

//now that all others are killed, we can store the current PID in the session
$_SESSION['pid'][]=posix_getpid();

//close the session now, otherwise the PID we just added won't actually be saved to the session until the process ends.
session_write_close();

有几件事要注意:

杀掉有两个值。第一个是pid,第二个应该是来自这份清单的信号常数之一。对我来说没有任何意义,其他人似乎只使用0就成功了,当我使用0时,它返回true。所以什么都行!

在资源密集的事情发生之前调用关闭()是至关重要的。否则,保存到会话中的新PID将不会实际保存到会话中,直到页面的所有处理完成为止。这意味着下一个过程将不知道取消一个仍在进行中并将永远持续的进程。

票数 -2
EN

Stack Overflow用户

发布于 2014-01-17 22:54:40

  1. 将布尔值存储在表中的DB中或会话中。
  2. 让您的资源密集型脚本定期检查该值,以确定它是否应该继续。如果DB说要停止,那么脚本就会取消它自己(例如,在当前函数中调用return; )。
  3. 当您想要取消(而不是调用abort(); )时,发出一个AJAX请求将该值设置为false
  4. 下次资源检查该值时,它将看到它必须停止。

潜在的限制: 1.您的脚本没有定期检查DB的方法。2.根据脚本检查DB的频率,可能需要几秒钟才能有效地杀死脚本。

票数 1
EN

Stack Overflow用户

发布于 2019-12-12 13:23:34

我认为这个问题缺少一些东西。执行请求的触发器是什么?你可能是在试图解决错误的问题。

让我详细说明一下。如果您的查找框实际上是在执行某种类型的自动完成,并且每次用户按下一个键时都在执行一个新的搜索,那么您将遇到您所描述的问题。

在这种情况下,解决办法不是扼杀整个过程。解决办法在于不启动它们。因此,如果只有一个字符可供搜索,您可能会做出一些决定,比如不尝试搜索--让我们选择三个字符。然后,我们可能会说,我们希望等到我们能够合理地确定用户在发送请求之前已经完成了输入。我们等1秒吧。

现在,有人在你的名字列表中查找所有保罗的名字,当他们键入'pau‘并暂停1秒时,会发送一个搜索,而不是三个搜索'p’,然后'pa‘,然后’pau‘.所以没必要杀人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21194127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档