停止请求服务器端

问题描述 投票:0回答:2

我有一个名称查找框,可以按照典型的ajax请求进行操作。这是每次按下一个字母时触发的Javascript的一般流程:

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

问题是nameLookup.php非常耗费资源。在某些情况下,从SQL数据库中提取多达10,000个名称,解密并与字符串进行比较。在正常情况下,请求可能需要5到60秒才能返回。

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

所以,如果你这样做:

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

服务器要么甚至没有处理请求3,直到它完成了1和2 ...或者它只是挂起来处理请求1和2,请求3需要花费更长的时间。

我需要知道如何告诉服务器停止处理请求1和2,这样我就可以腾出资源让它在Request 3上工作。

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

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

潜在的限制:1。您的脚本无法定期检查数据库。 2.根据脚本检查数据库的频率,可能需要几秒钟才能有效地终止脚本。


-2
投票

我已经提出了一个很棒的解决方案,我已经测试过并且它工作得非常好。只需几行PHP代码就可以放入任何资源密集的文件中。

该解决方案利用服务器的Process Identifier (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();

值得注意的事情:

posix_kill有两个值。第一个是pid,第二个应该是来自this list的信号常数之一。没有什么对我有任何意义,其他人似乎只使用0成功,当我使用0时它返回true。无论如何工作!

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

© www.soinside.com 2019 - 2024. All rights reserved.