gpt4 book ai didi

php - 异步运行 PHP 任务

转载 作者:IT老高 更新时间:2023-10-28 11:44:47 26 4
gpt4 key购买 nike

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

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

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 for message queuing 的博文

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

关于php - 异步运行 PHP 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com