为了账号安全,请及时绑定邮箱和手机立即绑定

异步运行PHP任务

异步运行PHP任务

PHP
慕丝7291255 2019-07-11 16:01:04
异步运行PHP任务我在一个有点大的Web应用程序上工作,后端主要是PHP。在代码中有几个地方我需要完成一些任务,但我不想让用户等待结果。例如,当创建一个新的帐户,我需要给他们一个欢迎电子邮件。但是当他们按下“完成注册”按钮时,我不想让他们等到电子邮件被实际发送之后,我只想启动这个过程,并立即向用户返回一条消息。到目前为止,在某些地方,我一直在使用与exec()类似的黑客攻击。基本上是这样做的:exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");这似乎有效,但我想知道是否有更好的方法。我正在考虑编写一个在MySQL表中排队任务的系统,以及一个单独的长期运行的PHP脚本,该脚本每秒查询该表一次,并执行它找到的任何新任务。如果需要的话,这样做还可以让我将来将任务分给几台工人机器。我在重新发明方向盘吗?有比exec()黑客或MySQL队列更好的解决方案吗?
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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

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

  • 吉尔曼

    -这个答案是在2009年写的,从那以后,GearMan看起来是一个很受欢迎的选择,见下面的评论。
  • ActiveMQ

    如果您想要一个完整的开放源码消息队列。
  • ZeroMQ

    -这是一个非常酷的套接字库,它可以轻松地编写分布式代码,而不必过于担心套接字编程本身。您可以将它用于单个主机上的消息队列?您只需让您的webapp将某些内容推送到一个队列中,在下一个合适的机会下,一个连续运行的控制台应用程序就会使用该
  • 贝斯塔克

    -只在写这个答案时找到了这个,但看起来很有趣
  • 落差

    是一个基于PHP的消息队列项目,但自2010年9月以来一直没有得到积极维护
  • PHP-队列

    是最近(2017年)维护的针对各种队列系统的包装器。
  • 最后,一篇关于使用

    消息队列的memcached

另一个,也许更简单的方法是使用忽略用户中止-一旦将页面发送给用户,就可以进行最终处理,而不必担心过早终止,尽管从用户的角度看,这确实会延长页面加载的时间。


查看完整回答
反对 回复 2019-07-11
?
aluckdog

TA贡献1847条经验 获得超7个赞

当您只想执行一个或几个HTTP请求而不必等待响应时,也有一个简单的PHP解决方案。

在调用脚本中:

$socketcon = fsockopen($host, 80, $errno, $errstr, 10);if($socketcon) {   
   $socketdata = "GET $remote_house/script.php?parameters=... HTTP 1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n";      
   fwrite($socketcon, $socketdata); 
   fclose($socketcon);}// repeat this with different parameters as often as you like

在被调用的script.php上,您可以在第一行调用这些PHP函数:

ignore_user_abort(true);set_time_limit(0);

这将导致在HTTP连接关闭时脚本不受时间限制地继续运行。


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 639 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信