异步运行PHP任务

异步运行PHP任务

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

到目前为止,在某些地方,我一直在使用与exec()类似的黑客攻击。基本上是这样做的:

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

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

我在重新发明方向盘吗?有比exec()黑客或MySQL队列更好的解决方案吗?


慕丝7291255
浏览 640回答 3
3回答

largeQ

我使用了排队方法,它可以很好地工作,因为您可以将处理推迟到服务器负载空闲时,如果您可以轻松地将“不紧急的任务”分区,则可以非常有效地管理负载。滚动自己并不是太棘手,这里有一些其他选项可以查看:吉尔曼-这个答案是在2009年写的,从那以后,GearMan看起来是一个很受欢迎的选择,见下面的评论。ActiveMQ如果您想要一个完整的开放源码消息队列。ZeroMQ-这是一个非常酷的套接字库,它可以轻松地编写分布式代码,而不必过于担心套接字编程本身。您可以将它用于单个主机上的消息队列?您只需让您的webapp将某些内容推送到一个队列中,在下一个合适的机会下,一个连续运行的控制台应用程序就会使用该贝斯塔克-只在写这个答案时找到了这个,但看起来很有趣落差是一个基于PHP的消息队列项目,但自2010年9月以来一直没有得到积极维护PHP-队列是最近(2017年)维护的针对各种队列系统的包装器。最后,一篇关于使用消息队列的memcached另一个,也许更简单的方法是使用忽略用户中止-一旦将页面发送给用户,就可以进行最终处理,而不必担心过早终止,尽管从用户的角度看,这确实会延长页面加载的时间。

aluckdog

当您只想执行一个或几个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连接关闭时脚本不受时间限制地继续运行。
打开App,查看更多内容
随时随地看视频慕课网APP