【问题标题】:How to cancel a PHP process, when ajax call is cancelled?当ajax调用被取消时,如何取消PHP进程?
【发布时间】:2013-05-29 09:34:33
【问题描述】:

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

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

提前感谢您的回答。

【问题讨论】:

  • 您可以限制需要在搜索框中填写的数字字符,或者在搜索框出现时使用 jQuery ajax 进行搜索。
  • 如果只有用户点击“搜索”按钮或点击回车键,您应该开始搜索。
  • 如果执行搜索查找的时间过长,以至于进程在多次运行时会导致服务器宕机,那么您需要优化搜索例程,而不是试图杀死已经运行的进程。在搜索列上放一个键,获取结果需要几分之一秒

标签: php ajax search request


【解决方案1】:

你的服务器端 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连接

【讨论】:

    【解决方案2】:

    您在寻找 ignore_user_abort() 吗?

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

    【讨论】:

    • 阅读注释:PHP 不会检测到用户已中止连接,直到尝试向客户端发送信息。而且默认设置已经是false了。
    【解决方案3】:

    谢谢大家的回答。

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 这并不能解决我的问题,因为它还会向服务器发送多个请求。因此,当注册了新数据但服务器进程继续运行时,它会取消 ajax 请求,直到服务器配置为不这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2011-03-12
      • 1970-01-01
      • 2022-10-24
      相关资源
      最近更新 更多