我正在整理我的第一个商业PHP应用程序,因为我还在急切地学习PHP,所以没什么大不了的。)
现在我仍处于规划我的应用程序的概念阶段,但我一直遇到一个问题,应用程序应该由我的客户自己托管,在他们自己的服务器上,并且将包括一些非常长的运行脚本,取决于每个客户在其应用程序中输入的数据量。
现在我认为我有两个选择,要么使用cronjobs,例如让每个客户可以自己设置一个或多个cronjobs,或者将整个数据处理作为在后台运行的守护进程。
我的问题是,因为它是一个自托管的应用程序(并且每个服务器都不同)...甚至建议尝试编写在客户服务器上启动后台进程的php,或者这更像是你可以做的事情只能在你自己的服务器上做到可靠......?
或者我应该在这些长时间运行的过程中使用cronjobs吗?
(取决于我的客户将在应用程序中输入的数据量,一个过程可能会运行3个多小时)
这是否是一个可以用PHP可靠解决的问题......?对不起,如果这应该是一个奇怪的问题,我真的没有经验丰富的PHP守护进程和/或由php创建的长期运行的cronjobs。
所以回顾一切: 商业自托管应用程序,包括长时间运行的进程,cronjobs或守护进程?对于付费应用程序而言,或者两者都是可靠的解决方案,您可以凭良心向您的客户提供,因为您知道它可以在各种不同的服务器上运行可靠...?
修改* PS:对不起,我忘了提到该应用程序仅针对Linux服务器,所以像Debian,Ubuntu等等。
答案 0 :(得分:4)
简短回答,不,如果这是一个客户端托管解决方案,请不要进行后台处理。如果你转向ASP概念(应用程序服务提供商...而不是Active Server Pages;))那么你可以用后台进程和外部应用程序连接到你的sql服务器并为你处理东西来做一些古怪的事情。
我建议创建一个强大的任务管理主干并将其链接到一个可靠的任务处理基础架构。我建议你阅读一篇很久以前我做过的关于后台流程和我采用的策略修复长期运行流程的旧帖子:
Start & Stop PHP Script from Backend Administrative Webpage
快乐阅读......
<强>更新强>
我意识到我的旧职位远非易懂,所以这里有:
您需要2个模型:Job和JobQueue,2个控制器:JobProcessor,XYZProcessor
当页面触发或使用cronjob时,用户可以调用JobProcessor。 JobProcessor :: process()是启动整个处理或继续处理的键。它加载JobQueues并询问作业队列是否有工作要做。如果有工作要做,它会要求工作队员开始/继续工作。JobQueue模型:用于将多个JOBS排在一起,并通过保留某种ID和STATE来控制当前正在运行的作业来控制当前的作业。
作业模型:准确表示需要完成的工作,它包含例如将处理数据的控制器的名称,调用以处理数据的函数以及描述必须执行的操作的序列化配置属性。 / p>
XYZController:是包含处理方法的那个。当调用处理方法时,控制器必须将所需的所有内容加载到内存中,然后尽快处理每个单独的工作单元。
示例:
最终,您可以每次打开一个套接字并要求处理器执行某些操作,或者您可以将CronJob排队以调用您的处理器。通过这种方式,您的用户不会等待每次完成3/4工作单元。
答案 1 :(得分:2)
值得注意的是,除了运行守护进程或cron作业之外,您还可以从Web请求中启动long running processes(但请注意,它必须在Web服务器进程组之外运行),当然{{3 (这实际上是批处理方法的变体)。
所有这四种方法在行为方式,并发性和时序管理方面都有很大差异。使它们全部不同的因素与您在问题中省略的因素相同 - 因此无法回答。
不幸的是,所有设备都依赖于MSWindows和POSIX系统之间非常不同的设施 - 所以虽然PHP会在两者上运行,但如果你想在两个平台上销售你的应用程序,它将需要2个版本。
也许您应该与您的潜在客户群交谈并询问他们想要什么?