异步运行PHP任务

我在一个比较大的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-将页面发送给用户后,您可以进行最终处理而不必担心过早终止,尽管这样做的确会延长用户页面的加载时间透视。

以上是 异步运行PHP任务 的全部内容, 来源链接: utcz.com/qa/404814.html

回到顶部