我目前正在与一个庞大的数据库的CRM系统工作。如果用户想要搜索客户,他可以使用ajax搜索。每当他在搜索字段中更改某些内容时,当一个呼叫正在挂起时,旧的呼叫将被取消,新的呼叫将被发送到服务器。我的问题是,php进程在服务器端继续运行。因此,如果用户开始输入一个地址,几个请求被启动和取消,服务器需要越来越多的时间来回答。
是否有可能取消正在运行的php进程,当ajax调用被取消?或者在服务器端是否有一个可能的解决方案,来检测来自同一用户的搜索请求是否正在运行,并在开始新的搜索请求之前取消它?
提前感谢您的回答。
您的服务器端php必须输出一些东西来检测请求被取消。但是,由于您可能执行冗长的sql查询,因此无法输出任何内容。
但是你仍然可以保存你的连接id到一个会话中,如果它被检测到,就终止连接:
- 公开会议
- 打开sql连接
- 如果会话中设置了search_connection_id,终止连接
- 找到您的连接id,在会话中保存为search_connection_id
- 关闭会话-重要,否则下一个请求将在步骤1中被阻止 <
- 查询数据库/gh>
- 如果连接被破坏,这是另一个搜索杀死你在步骤3,退出
- 打开会话,删除search_connection_id
- 发送响应,关闭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/这是非常容易的,它工作得很好,它甚至已经内置了缓存系统