什么是编写Linux守护进程的首选方法?

5

大家好

我有一个PHP网站,应该使用一些缓存数据(例如存储在Memcache中)。 数据应由从 Web 服务获取它的后台程序存储在缓存中,其中一些数据也应存储在 MySQL 服务器中。

后台程序应执行以下操作:

  1. 获取外汇汇率,解析并将其存储在数据库中以及分别存储在两个不同的 Memcache 中的两个不同机器中。
  2. 获取金融指标并将其存储在不同的 Memcache 中。
  3. 获取大型 XML 数据并将其存储在两个不同的 Memcache 中。

我会用 C/C++/Perl/PHP/Python 写这些后台程序。

我需要决定选择哪种语言/脚本来实现这些后台程序。 使用 PHP 的优点是可以使用网站应用程序本身使用的 API。另一个优点是 PHP 简单易学,每个人都懂得,因此我不必一直维护这些后台程序,但另一方面,PHP 比较慢,消耗更多资源。

使用不同于 PHP 的其他语言的主要缺点是维护使用 C/C++/Perl 编写的代码更难。如今,我猜做这些任务时使用 C/C++/Perl 不太常见。我说错了吗?

在这种情况下,你会推荐我采取什么措施?


3
您的意思是说,相比C或C++代码,维护PHP代码更容易? - Falmarri
1
那么,你有什么问题吗?你是在寻求别人劝阻你使用PHP吗? - chrisaycock
通常来说,这对于中等规模的应用程序是正确的。我只能根据我的经验发表意见 ;) - Yossi
1
在你的系统上,几乎(如果不是全部)所有的后台程序都是用C/C++编写的。 - cristian
1
使用PHP以外的语言编写代码的主要缺点是难以维护C/C++/Perl编写的代码。现在,我猜使用C/C++/Perl执行这些任务并不常见。我的说法错了吗?是的,非常错误,但听起来你已经决定要用PHP编写代码,并正在寻求对你的决定的确认。 - the Tin Man
显示剩余3条评论
5个回答

4

为了简单性/代码重用,最好的选择可能是PHP。

PEAR系统守护程序
在php中创建守护进程

编辑
据我所知,它只是在传递数据,没有什么需要担心的性能问题。关于资源使用情况,只需确保不要耗尽max_memory(通过流式处理或配置充足等方式)。如果操作时间太长,请中止并记录。在SQL操作失败时,在循环中重新连接到数据库等。

注意事项
守护程序编程很棘手,许多事情可能会出错。考虑所有故障点。

另外,请注意Perl在守护进程方面比PHP更有经验。我省略了C / C ++,因为性能(传递数据)并不是问题,守护进程编程已经够难了,为什么要增加对内存泄漏、段错误等的担忧呢?


你可以安装PHP仅命令行接口版本以最小化占用空间。你也可以设置shell ini脚本,以确保守护进程在系统重启后加载。 - dqhendricks
clyfe:你说“中止并记录执行时间过长的操作”是什么意思?我不太理解... - Yossi
这个想法是保持在提议的30秒循环上。当你读取一个服务时,有时可能会花费太长时间来响应(比如说,它有太多同时请求)或者完全停止响应,这些情况必须考虑在内,因为最微小的错误都可能导致你的守护进程崩溃。而且像Monit这样的工具是非常宝贵和有帮助的。 - clyfe
但我仍然对PHP不是编写守护进程的自然选择感到困扰。出于某种原因,当涉及到守护进程时,我并不感到太自信...我知道这听起来不太专业,也没有事实支持,但无论如何,你明白我的意思吗? - Yossi
就我个人而言,我会选择Ruby(无论是Web还是守护进程)。所以,在这种冥想的情况下,我无法安慰你的恐惧。确实,PHP并不是一个自然的选择,但请尝试进行心理映射,看看它是否满足您的需求(很可能是这样)。如果有其他人在PHP中执行守护程序,那么就没有太多可担心的了,对吧? - clyfe

4
Perl和Python是编写此类脚本的默认答案。但是,如果您编写良好的代码,使用什么语言并不重要(多)。更重要的是,您如何处理脚本失败。
从长远来看,您可能会发现您的脚本很少因任意原因而失败,并且您可能不值得调试脚本,因为它通常做得很好,很难找到它出了什么问题。
我有几个perl脚本正在做你正在做的同样的事情。对我来说,棘手的部分是确保我的脚本不会长时间失败,因为我不想错过一段实时流数据。
为此,我使用monit。一个很棒的工具。

3
最佳实践是使用您最熟悉的技术。这样您将会:
  • 更快地实现解决方案
  • 更好地调试遇到的问题
  • 更容易评估可以为您卸载部分工作的库(甚至了解它们)
  • 更轻松地维护和扩展代码
实际上,速度和资源使用率只有在您真正需要性能时才相对重要。

2

简短版: 我会使用Python。

详细版: 我已经尝试过使用cli模式下的PHP,经历了很多内存泄漏的问题,这肯定是因为PHP库不好,或者PHP库从未被用于除快速在Web请求模式下死亡之外的其他事情(例如,我对PDO持怀疑态度)。

Python领域中,我最近看到了来自shinken的代码部分,这是一个不错的Nagios重写作为Python守护程序,非常聪明。请参见 http://www.shinken-monitoring.org/the-global-architecture/ http://www.shinken-monitoring.org/wiki/official/development-hackingcode 。由于这是一个监控工具,因此您可以在那里找到一些重复任务的非常好的想法。

现在,我能提出建议吗?为什么不将Shinken或Centreon用作数据获取任务的计划程序?(也许很快就会用shinken引擎而不是nagios引擎进行中心化?)这可能有助于检测外部数据的更改,获取问题等。

然后对于应完成的任务(获取数据,转换数据,存储数据等),这是一个ETL的工作。一个不错的开源工具是Talend ETL(Java)。有一些针对Talend 的调度和监控工具,但不是开源的(在你必须支付许可证的所谓开源中)。但是添加像Nagios这样的外部计划程序来处理任务应该很容易(我希望如此)。您需要检查memcached是否可用作talend ETL的存储引擎,或者编写自己的插件。

因此,这是要说的与其考虑语言,也许您应该考虑工具。或者不考虑,具体取决于您可以承担的复杂性,每个工具都增加了它自己的复杂性。但是如果您想从头开始重建,则Python快速高效。


0

您应该使用与应用程序的其余部分相同的语言。这样,您可以更轻松地重复使用代码和开发人员技能。

然而,正如其他人所指出的那样,PHP对于长时间运行的守护进程来说是不好的,因为它处理内存的方式容易泄漏。

因此,我会在“cron”作业中运行这些任务,以便定期(重新)启动,但请确保您不要运行比您打算的更多的任务副本。

与守护进程相比,Cron作业更加健壮。

  • 失败并退出的Cron作业将在下次计划时重新启动
  • 包含内存泄漏的Cron作业将在结束运行时释放其内存
  • 具有其软件更新(库等)的Cron作业将在随后的运行中自动获取新版本,无需任何特殊操作。
  • “cron”已经提供了启动/关闭脚本,您的Ops团队可以使用它来控制它,因此您不需要重新编写这些内容。您的Ops团队已经知道如何操作“cron”,并且知道如何注释掉crontab条目以暂时禁用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接