当ajax调用被取消时,如何取消PHP进程?

时间:2013-05-29 09:34:34

标签: php ajax search request

我目前正在开发一个拥有庞大数据库的CRM系统。 如果用户想要搜索客户,他可以使用ajax搜索。每次他在搜索字段中更改某些内容时,当呼叫处于待处理状态时,旧呼叫将被取消,并且新呼叫将被发送到服务器。 我的问题是,服务器端的php进程继续运行。因此,如果用户开始输入地址,则会启动和取消多个请求,服务器需要越来越多的时间来回答。

当ajax调用被取消时,是否可以取消正在运行的php进程? 或者在服务器端是否有可能的解决方案,以检测来自同一用户的搜索请求是否正在运行并在启动新请求之前将其取消?

提前感谢您的回答。

4 个答案:

答案 0 :(得分:4)

你的服务器端php必须输出一些东西来检测请求被取消。但是,由于您可能执行冗长的SQL查询,因此无法输出任何内容。

但是您仍然可以将您的连接ID保存到会话中,并在检测到连接时终止连接:

  1. 开放会话
  2. 打开sql连接
  3. 如果在会话中设置了search_connection_id,则终止连接
  4. 找到您的连接ID,将会话保存为search_connection_id
  5. 关闭会话 - 重要,否则下一个请求将在步骤1中被阻止
  6. 查询数据库
  7. 如果连接中断,则会在步骤3中退出另一个搜索,退出
  8. 打开会话,删除search_connection_id
  9. 发送响应,关闭sql连接

答案 1 :(得分:3)

您在寻找ignore_user_abort()吗?

http://www.php.net/manual/en/function.ignore-user-abort.php

答案 2 :(得分:1)

谢谢大家的回答。

我像Anigel建议的那样重新设计了我的搜索查询,结果令人难以置信。

但我认为我的问题的正确答案是Marek和Harikrishnan Viswanathar的答案。两者都应该按照我的要求行事。

答案 3 :(得分:0)

我现在想出了一个解决方案。

您可以在发送ajax请求时设置布尔值isPending,您可以将此值设置为true

调用ajax回调(成功或错误)后,您可以将isPending设置为false;

此外,您可以拥有字符串变量searchContent并在更改文本时更新此变量。因此,当Ajax Call未挂起且searchContent具有内容时,您可以发送另一个ajax调用。

最好的选择是使用已编写的解决方案,例如:http://jqueryui.com/autocomplete/它非常简单,而且它甚至已经内置了缓存系统。