如何取消一个PHP进程,当ajax调用被取消


How to cancel a PHP process, when ajax call is cancelled?

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

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

提前感谢您的回答。

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

但是你仍然可以保存你的连接id到一个会话中,如果它被检测到,就终止连接:

  1. 公开会议
  2. 打开sql连接
  3. 如果会话中设置了search_connection_id,终止连接
  4. 找到您的连接id,在会话中保存为search_connection_id
  5. 关闭会话-重要,否则下一个请求将在步骤1中被阻止
  6. <
  7. 查询数据库/gh>
  8. 如果连接被破坏,这是另一个搜索杀死你在步骤3,退出
  9. 打开会话,删除search_connection_id
  10. 发送响应,关闭sql连接

您正在寻找ignore_user_abort()吗?

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

谢谢大家的回答。

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

但我认为我的问题的正确答案是Marek和Harikrishnan Viswanathar的答案。

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

你可以设置一个布尔值isPending当ajax请求发送时,你可以设置这个值为true

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

此外,您可以有一个字符串变量searchContent,并在文本更改时更新该变量。所以当Ajax调用没有挂起,searchContent有内容,你可以发送另一个Ajax调用。

最好的选择是使用已经写好的解决方案,例如:http://jqueryui.com/autocomplete/这是非常容易的,它工作得很好,它甚至已经内置了缓存系统