首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >执行长期运行的PHP脚本的最佳实践

执行长期运行的PHP脚本的最佳实践
EN

Stack Overflow用户
提问于 2017-10-28 16:07:41
回答 3查看 4.4K关注 0票数 1

我们需要分发软件,其中应该包含一个PHP脚本,将运行几分钟。因此,我正在寻找一种最佳的实践方法,在2017年做到这一点。

  • 它必须由HTTP 调用。应该不会有HTTP请求等待几分钟,所以脚本必须在访问者获得HTTP响应后继续运行。
  • 它必须定期运行(每晚)。它还应该在每个默认情况下每晚运行(比如cron作业)。注意:由于该软件将分发给客户端,因此我们无法手动添加cronjob (我们无法访问客户端服务器)。一切都应该在PHP代码中完成。

(请注意,我自己读过现有的博客文章和堆栈溢出问题,但找不到令人满意的答案)

也许有人知道像Symfony和Laravel这样的框架或者像Magento这样的网络商店是如何完成这些任务的?不过,我还是想知道如何在不使用框架或库的情况下,自己在普通PHP中完成这项工作。

EN

回答 3

Stack Overflow用户

发布于 2017-10-28 19:02:10

有许多解决办法:

  • 使用exec (相当不安全)触发后台作业(注释中推荐,我可能更喜欢symfony流程,但仍然不安全)。
  • 经常使用cron来触发symfony进程,而不是通过http因此方式更安全。
  • 使用php-fpm,您可以使用请求发送响应而不停止进程。
  • 使用队列系统(SQS、RabbitMQ、Kafka等)。
  • 使用PHP中的cron管理器
  • 使用一个守护进程和类似于supervisord之类的东西来确保它持续运行。

最好的解决方案肯定是队列和cron,然后是PHP,其余的都是垃圾。

你绝对不可能在别人的服务器上运行,除非你做了一些在某一时刻无法工作的事情。

Sidenote:你说过你不想让图书馆自己去做,我给图书馆添加了链接,因为阅读它们可以让你更深入地了解这种技术,这些图书馆质量很高。

票数 6
EN

Stack Overflow用户

发布于 2017-10-29 20:47:37

如果您为Magento设置了一个常规的cron作业,则Magento只运行它。它有一个cron.sh,它每分钟运行一次,执行Magento队列中的作业。

任何通过http执行长期运行任务的解决方案都涉及到web服务器配置。

票数 1
EN

Stack Overflow用户

发布于 2017-12-20 18:10:36

最后,我认为有两种方法可以通过HTTP请求(不让用户等待很长时间)在PHP中启动长时间运行的进程:

  • 使用FPM并使用请求()将响应发送给用户。在发送响应之后,您可以做任何您想做的事情,例如长时间运行的任务。(在这里,您不必启动一个新进程,只需继续使用PHP)。 fastcgi_finish_request();
  • 使用以下函数之一创建一个新进程。将STDOUT和STDERR重定向为null,并将其放到后台(必须同时执行这两项操作)。要获得新进程的输出,新进程可以写入某个日志文件。 exec('php longrunningtask.php >/dev/null 2>/dev/null &');shell_exec('php longrunningtask.php >/dev/null 2>/dev/null &');系统(‘php longrunningtask.php >/dev/null 2>/dev/null &');passthru('php longrunningtask.php >/dev/null 2>/dev/null &’‘); 或者像proc_open()一样使用symfony/process

备注:

  • symfony/process:在文档中,您可以看到可以将FPM和fastcgi_finish_request()用于长期运行的任务。
  • 安全性:我看到没有内置的安全风险,您只需做正确的事情,那么一切都很好(您可以使用密码保护,验证可能的输入到您的命令,等等)。
  • 对于这个问题的一部分,没有答案。我觉得这不可能。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46991758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档