14

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

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

提前感谢您的回答。

4

4 回答 4

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连接
于 2013-05-29T10:22:36.503 回答
3

您在寻找 ignore_user_abort() 吗?

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

于 2013-05-29T11:49:38.150 回答
1

谢谢大家的答案。

我像 Anigel 建议的那样重新设计了我的搜索查询,结果非常好。

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

于 2013-05-29T13:36:07.220 回答
0

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

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

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

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

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

于 2013-05-29T09:58:55.480 回答