当前位置: 首页 > 面试题库 >

异步运行PHP任务

江敏学
2023-03-14
问题内容

我在一个比较大的Web应用程序上工作,后端主要使用PHP。代码中有几个地方需要完成一些任务,但是我不想让用户等待结果。例如,在创建新帐户时,我需要向他们发送欢迎电子邮件。但是,当他们按下“完成注册”按钮时,我不想让他们等到实际发送电子邮件之后,我只想开始该过程,并立即向用户返回一条消息。

到目前为止,在某些地方,我一直在使用exec()感觉像是被黑客入侵。基本上是这样的:

exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");

这似乎可行,但我想知道是否有更好的方法。我正在考虑编写一个在MySQL表中排队任务的系统,以及一个单独的长时间运行的PHP脚本,该脚本每秒查询一次该表,并执行它发现的所有新任务。如果将来需要的话,这还具有让我将来在几台工作机之间分配任务的优势。

我在重新发明轮子吗?有没有比exec()hack或MySQL队列更好的解决方案?


问题答案:

我使用了排队方法,它可以很好地工作,因为您可以将处理推迟到服务器负载空闲之前,如果可以轻松地划分“不紧急的任务”,就可以非常有效地管理负载。

自己滚动不是很棘手,以下是一些其他可供选择的选项:

  • GearMan-该答案写于2009年,从那时起,GearMan似乎是一个受欢迎的选择,请参阅下面的评论。
  • 如果您想要完整的开源消息队列,请使用ActiveMQ。
  • ZeroMQ-这是一个非常酷的套接字库,可以轻松编写分布式代码,而不必太担心套接字编程本身。您可以将其用于单个主机上的消息队列-您只需将Web应用程序推送到队列中,然后连续运行的控制台应用程序将在下一个合适的时机使用该队列
  • beanstalkd-仅在编写此答案时找到了这个,但看起来很有趣
  • dropr]是一个基于PHP的消息队列项目,但是自2010年9月以来一直没有得到积极维护
  • php-enqueue是最近(2017年)维护的各种队列系统包装器
  • 最后,有关使用memcached进行消息排队

另一种也许更简单的方法是使用ignore_user_abort-将页面发送给用户后,您可以进行最终处理而不必担心过早终止,尽管这样做的确会延长用户页面的加载时间透视。



 类似资料:
  • 我只想确保我很好地理解异步await和task.run或task.whenall之间的区别 所以异步等待就是处理异步方法。它意味着隐含着一个处理顺序。 我在不阻塞主线程的情况下运行了一个很长的处理,并等待结果继续。 对于task.run和task.when,这里有一个多线程的新概念。这意味着我可以在一个新线程上启动一个长进程,它不会等待完成来继续代码。代码在新线程上。在这个线程上,我可以等待方法。

  • 问题内容: 如何不等待就异步运行PHP代码?我有一个长期运行(几乎无限),应该在服务器启动时运行,并且应该异步处理而无需等待。 我猜可能的选择是: 在网页中运行代码并保持打开状态以执行该任务 从某些在后台处理的命令行实用程序(我不确定如何)调用脚本。 我在本地服务器上运行PHP脚本,该脚本将在发生某些事件(例如生日提醒)时发送电子邮件。 请提出在不使用浏览器打开页面的情况下如何实现此目的。 问题答

  • 这是在一次Android采访中被问到的。有人问我是否可以从异步任务 1 的 doInBackground() 方法(让它成为 Task1)启动另一个异步任务(让它成为 Task2)。我浏览了文档,其中说了以下内容: 必须在UI线程上创建任务实例。 必须在 UI 线程上调用 execute(Params...)。 根据这些陈述,我认为从另一个任务的后台方法启动一个任务是不可能的。此外,async任务

  • 在Server程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。 Swoole提供了异步任务处理的功能,可以投递一个异步任务到TaskWorker进程池中执行,不影响当前请求的处理速度。 程序代码 基于第一个TCP服务器,只需要增加onTask和onFinish 2个事件回调函数即可。另外需要设置task

  • 我试图了解 Task.Run Wait() 异步等待是如何工作的。 我已经阅读了这个页面:了解在一行中使用Task.Run Wait()异步等待的使用,但不太理解它。 在我的代码中,我从Microsoft EventHub接收事件,并使用实现的类处理它们。我在 () 中调用 方法,这是一个异步方法,这是一个方法。由于该方法是的,因此我使用 和来委派。(即 或< code >。Wait()(该方法是

  • 我们有一个async/await方法,它通过实体框架调用存储的过程,该框架由同步方法调用。 需要很长的时间来执行,这可能就是我们编写async/await的原因,它可以被多个地方使用。 我知道我们不应该混合异步和同步调用,但假设我们有这种情况并且我们正在使用 从同步方法 调用异步方法 GetLoanDataAsync,我理解该方法 - 将在后台线程上运行。 我的问题是,如果我们有一个异步方法< c