我有一个名称查找框,它由您典型的ajax请求操作。以下是每次按信时触发Javascript的一般流程:
问题是nameLookup.php资源非常多。在某些情况下,将从SQL数据库中提取多达10,000个名称,对其进行解密,并与字符串进行比较。在正常情况下,请求可以在任何地方从5到60秒内返回。
我完全理解,当您在客户端中止请求时,服务器仍在处理一些事情,并将结果发回。只有客户端知道如何忽略响应。但是服务器正在忙于处理所有这些请求。
所以如果你这么做了:
在完成1和2之前,服务器甚至不能处理请求3.或者,请求3需要很长时间才能完成请求1和请求2的工作。
我需要知道如何告诉服务器停止处理请求1和2,这样我就可以释放资源让它处理请求3。
我在客户端使用Javascript & jQuery。服务器端的PHP/Apache和SQL。
发布于 2014-01-17 22:42:14
我想出了一个很棒的解决方案,我已经测试过了,而且效果很好。这只是几行PHP代码,用于输入任何资源密集型的文件。
此解决方案利用来自服务器的进程标识符(PID)。我们可以使用两个PHP函数: posix_getpid()来获取当前PID,而posix_kill()则可以杀死另一个PID。这还假设您已经在其他地方调用了session_start()。
下面是代码:
//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将不会实际保存到会话中,直到页面的所有处理完成为止。这意味着下一个过程将不知道取消一个仍在进行中并将永远持续的进程。
发布于 2014-01-17 22:54:40
return; )。abort(); )时,发出一个AJAX请求将该值设置为false。潜在的限制: 1.您的脚本没有定期检查DB的方法。2.根据脚本检查DB的频率,可能需要几秒钟才能有效地杀死脚本。
发布于 2019-12-12 13:23:34
我认为这个问题缺少一些东西。执行请求的触发器是什么?你可能是在试图解决错误的问题。
让我详细说明一下。如果您的查找框实际上是在执行某种类型的自动完成,并且每次用户按下一个键时都在执行一个新的搜索,那么您将遇到您所描述的问题。
在这种情况下,解决办法不是扼杀整个过程。解决办法在于不启动它们。因此,如果只有一个字符可供搜索,您可能会做出一些决定,比如不尝试搜索--让我们选择三个字符。然后,我们可能会说,我们希望等到我们能够合理地确定用户在发送请求之前已经完成了输入。我们等1秒吧。
现在,有人在你的名字列表中查找所有保罗的名字,当他们键入'pau‘并暂停1秒时,会发送一个搜索,而不是三个搜索'p’,然后'pa‘,然后’pau‘.所以没必要杀人。
https://stackoverflow.com/questions/21194127
复制相似问题