我有一个名称查找框,可以按照典型的ajax请求进行操作。这是每次按下一个字母时触发的Javascript的一般流程:
问题是nameLookup.php非常耗费资源。在某些情况下,从SQL数据库中提取多达10,000个名称,解密并与字符串进行比较。在正常情况下,请求可能需要5到60秒才能返回。
我完全理解当你在客户端中止请求时,服务器仍在处理事情并发回结果。只是客户端知道忽略响应。但是服务器正忙着处理所有这些请求。
所以,如果你这样做:
服务器要么甚至没有处理请求3,直到它完成了1和2 ...或者它只是挂起来处理请求1和2,请求3需要花费更长的时间。
我需要知道如何告诉服务器停止处理请求1和2,这样我就可以腾出资源让它在Request 3上工作。
我在客户端使用Javascript和jQuery。服务器端的PHP / Apache和SQL。
return;
)。abort();
,请发出一个AJAX请求,将该值设置为false
。潜在的限制:1。您的脚本无法定期检查数据库。 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将不会实际保存到会话中。这意味着下一个过程将不知道取消仍在进行并永远消失的那个过程。