gpt4 book ai didi

php - 商业 PHP 脚本,长时间运行的进程。守护进程与 cronjobs?

转载 作者:可可西里 更新时间:2023-11-01 00:35:33 31 4
gpt4 key购买 nike

我正在组装我的第一个商业 PHP 应用程序,它并不大,因为我仍在热切地学习 PHP :)

现在我仍处于规划我的应用程序的概念阶段,但我一直遇到一个问题,该应用程序应该由我的客户在他们自己的服务器上自行托管,并且将包含一些非常长的运行脚本,具体取决于每个客户在其应用程序中输入的数据量。

现在我想我有两个选择,要么使用 cronjobs,例如让一个或多个 cronjobs 在每个客户可以自己设置的时间运行,要么将整个数据处理作为在后台运行的守护进程。 .

我的问题是,因为它是一个自托管应用程序(并且每个服务器都不同)...是否建议尝试编写在客户服务器上启动后台进程的 php,或者这是您可以做的更多事情只在您自己的服务器上可靠地做...?

或者我应该为这些长时间运行的进程使用 cronjobs 吗?

(根据我的客户将在应用程序中输入的数据量,一个过程可能会运行 3 个小时以上)

这甚至是一个可以用 PHP 可靠地解决的问题吗...?如果这是一个奇怪的问题,请原谅,我真的没有使用 PHP 守护进程和/或由 php 创建的长时间运行的 cronjobs 的经验。

所以总结一下:商业自托管应用程序,包括长时间运行的进程、cronjobs 或守护进程?对于付费应用程序,您可以问心无愧地提供给您的客户,因为您知道它可以在各种不同的服务器上可靠地工作,这两者是否也是一种可靠的解决方案...?

编辑*PS:抱歉,我忘了说这个应用程序只针对 Linux 服务器,所以像 Debian、Ubuntu 等等。

最佳答案

简短的回答,不,如果这是客户端托管的解决方案,请不要使用后台进程。如果您采用 ASP 概念(应用程序服务提供商...不是 Active Server Pages ;)),那么您可以使用后台进程和连接到您的 sql 服务器并为您处理内容的外部应用程序做一些古怪的事情。

我的建议是创建一个强大的任务管理主干并将其链接到可靠的任务处理基础架构。我会建议您阅读我很久以前写的一篇关于后台进程和我为修复长时间运行的进程而采用的策略的旧帖子:

Start & Stop PHP Script from Backend Administrative Webpage

阅读愉快...

更新

我意识到我的旧帖子远不容易理解,所以这里是:

您需要 2 个模型:Job 和 JobQueue,2 个 Controller :JobProcessor、XYZProcessor

JobProcessor 可以在页面触发时由用户调用,也可以根据需要使用 cronjob。 JobProcessor::process() 是启动整个处理或继续处理的关键。它加载 JobQueues 并询问作业队列是否有工作要做。如果有工作要做,它会要求作业队列开始/继续它的工作。

JobQueue 模型:用于将多个 JOBS 依次排入队列,并通过保留某种关于正在运行的作业的 ID 和 STATE 来控制当前的作业。

作业模型:准确表示需要完成的工作,它包含例如将处理数据的 Controller 的名称、调用以处理数据的函数以及描述必须完成的工作的序列化配置属性。

XYZController:是包含处理方法的。当调用处理方法时, Controller 必须将它需要的所有内容加载到内存中,然后尽快处理每个单独的工作单元。

示例:

  1. 调用index.php
  2. Index.php 创建一个作业处理器 Controller
  3. Index.php 调用 jobprocessor 的 process()
  4. JobProcessor::Process() 加载所有队列并处理它们
  5. 对于每个 JobQueue::Process(),作业队列加载它可能的作业并检测当前是否正在运行。如果没有运行,它通过调用 Job::Process() 启动下一个;
  6. Job::Process() 创建将处理手头任务的 XYZController。例如,我的旧系统有一个协同工作的 InvoicingController 和一个 MassmailingController。
  7. Job::Process() 调用 XYZController::Prepare() 以便它加载要处理的信息。 (例如,加载一批要处理的电子邮件,加载一批要创建的发票)
  8. Job::Process() 调用 XYZController::RunWorkUnit() 以便它处理单个工作单元(例如,创建一张发票、发送一封电子邮件)
  9. Job::Process() 询问 JobProcessingController::DoIStillHaveTimeToProcess(),如果是,则继续处理下一个元素。
  10. Job::Process() 超时并调用 XYZController::Cleanup() 以便释放所有资源
  11. JobQueue::Process() 结束并返回到 JobController
  12. JobController::Process() 即将结束?打开一个套接字,给自己打电话,这样我就可以开始另一轮处理,直到我无事可做为止
  13. 处理从位置 #1 开始的用户请求。

最终,您可以改为每次都打开一个套接字并要求处理器做某事,或者您可以排队一个 CronJob 来调用您的处理器。这样您的用户就不会每次都等待 3/4 的工作单元完成。

关于php - 商业 PHP 脚本,长时间运行的进程。守护进程与 cronjobs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9003511/

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