异步运行 PHP 任务

2024-04-22

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

到目前为止,在某些地方我一直在使用 exec() 的感觉。基本上做这样的事情:

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

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

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


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

自己动手并不太棘手,这里还有一些其他选项可供查看:

  • GearMan http://gearman.org/- 这个答案写于 2009 年,从那时起 GearMan 看起来是一个流行的选择,请参阅下面的评论。
  • ActiveMQ http://activemq.apache.org/如果您想要一个完整的开源消息队列。
  • ZeroMQ http://www.zeromq.org/- 这是一个非常酷的套接字库,它可以轻松编写分布式代码,而不必过多担心套接字编程本身。您可以将它用于单个主机上的消息队列 - 您只需让您的 Web 应用程序将某些内容推送到队列中,连续运行的控制台应用程序将在下一个合适的机会使用该队列
  • 豆茎 http://xph.us/software/beanstalkd/- 在写这个答案时才发现这个,但看起来很有趣
  • dropr https://github.com/s0enke/dropr/wiki/是一个基于 PHP 的消息队列项目,但自 2010 年 9 月以来一直没有积极维护
  • php-enqueue https://github.com/php-enqueue/enqueue-dev是最近(2017 年)维护的各种队列系统的包装器
  • 最后,一篇关于使用的博客文章memcached 用于消息队列 http://broddlit.wordpress.com/2008/04/09/memcached-as-simple-message-queue/

另一种也许更简单的方法是使用忽略用户中止 http://php.net/ignore_user_abort- 将页面发送给用户后,您可以进行最终处理,而不必担心提前终止,尽管从用户角度来看,这确实会延长页面加载时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步运行 PHP 任务 的相关文章

随机推荐