我在一个有点大的web应用程序上工作,后端主要是PHP.代码中有几个地方我需要完成一些任务,但我不想让用户等待结果.例如,创建新帐户时,我需要向他们发送一封欢迎邮箱.但当他们点击"完成注册"按钮时,我不想让他们等到邮箱真正发送,我只想开始这个过程,并立即向用户返回一条消息.

到目前为止,在一些地方,我一直在使用感觉像是对exec()的黑客攻击.基本上是这样做的:

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

看起来很管用,但我在想是否有更好的办法.我正在考虑编写一个在MySQL表中对任务进行排队的系统,以及一个单独的长时间运行的PHP脚本,该脚本每秒查询该表一次,然后执行它找到的任何新任务.这也有一个好处,那就是如果我需要的话,将来可以在几台工人机器上分配任务.

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

推荐答案

我使用过排队方法,它工作得很好,因为您可以将处理推迟到服务器负载空闲时,如果您可以很容易地划分"不紧急的任务",就可以非常有效地管理负载.

你自己动手并不难,这里有几个其他选项可以查看:

  • GearMan-这个答案写于2009年,从那时起,GearMan看起来就是一个流行的 Select ,参见下面的 comments .
  • ActiveMQ如果你想要一个完整的开源消息队列.
  • ZeroMQ-这是一个相当酷的套接字库,它使得编写分布式代码变得很容易,而不必太担心套接字编程本身.您可以将其用于单个主机上的消息队列-您只需让您的web应用程序将某些内容推送到队列中,持续运行的控制台应用程序将在下一个合适的机会使用该队列
  • beanstalkd-只在写这个答案时发现了这个,但看起来很有趣
  • dropr是一个基于PHP的消息队列项目,但自2010年9月以来一直没有积极维护
  • php-enqueue是最近(2017)针对各种队列系统维护的包装器
  • 最后,一篇关于使用memcached for message queuing的博客文章

另一种可能更简单的方法是使用ignore_user_abort-一旦您将页面发送给用户,您就可以进行最终处理,而不必担心过早终止,尽管从用户的Angular 来看,这确实有延长页面加载的效果.

Php相关问答推荐

使用WooCommerce本机产品短码时不考虑价格筛选(_SHORT CODE)

WooCommerce在store 页面上显示兼容多语言的产品属性

我必须对所有的SQL查询使用预准备语句吗?

将一个按钮添加到WooCommerce产品的管理视图中,该按钮链接到一个自定义的WebHook,并在末尾附加产品ID

Codeigniter 3中SMTP.office 365.com的截断问题

根据类别的数量折扣更改WooCommerce购物车商品价格

在 PHP MySQL 中自动生成账单编号

Woocommerce 临时购物车税未根据第一个请求正确计算

如何将不同的 Woocommerce 费用合并为一个名称?

在 mysql 上的 PDO 中启用自动提交并将自动提交设置为关闭

根据所选付款方式启用/禁用 WooCommerce 所需的 checkout 字段

使用 Laravel 和 Vue 进行图像表单验证

使用 PHP 的 OAuth 2.0 MAC

WooCommerce – 在新订单邮箱通知中显示产品分类计数

Woocommerce API 的 PHP Curl 附加参数

如何从 PHP 中的 .txt 文件中列出今天生日的人的姓名?

正则表达式 (php) 匹配单个 [ 或单个 ] 但忽略 [[ ]] 之间的任何内容?

正则表达式抓取递归括号的内容

Eloquent 的模型更新了它应该 laravel php 的更多行

如何在 php/laravel 中获取元素在数组中的位置