5

大家好,

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

守护程序应执行以下操作:

  1. 获取外汇汇率,解析它们并将它们存储在数据库中以及单独机器中的两个单独的内存缓存中。
  2. 获取财务指标并将其存储在单独的内存缓存中。
  3. 获取大型 XML 数据并将其存储在两个单独的内存缓存中。

我能够用 C/C++/Perl/PHP/Python 编写这些守护进程。

我必须决定我应该选择哪种语言/脚本来实现这些守护进程。使用 PHP 的好处是我可以使用网站应用程序本身使用的 API。另一个优点是 PHP 很简单,每个人都知道,所以我不会被束缚在维护这些守护进程上,但另一方面 PHP 速度较慢并且消耗更多资源。

使用 PHP 以外的其他语言的主要缺点是更难维护用 C/C++/Perl 编写的代码。如今,我想使用 C/C++/Perl 来完成这类任务并不常见。我这样说错了吗?

在这种情况下,你会建议我做什么?

4

5 回答 5

4

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

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

编辑
据我所知,它只是传递数据,无需担心性能。关于资源使用,请确保不要用完 max_memory (通过流式传输或大量配置)。中止和记录耗时过长的操作。当 SQL 操作失败等时,在循环中重新连接到数据库。

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

另外,请注意 Perl 在守护进程方面比 PHP 更精通。我忽略了 c/c++,因为性能(传递数据)不是问题,而且守护进程编程已经够难了,为什么还要担心内存泄漏、段错误等?

于 2011-01-08T20:59:34.187 回答
4

Perl 和 Python 是编写此类脚本的默认答案。但是,如果您编写好的代码,使用什么语言并不重要。更重要的是你如何处理失败的脚本。

从长远来看,您可能会看到您的脚本很少因任意原因而失败,并且您可能不值得调试脚本,因为它通常做得很好,而且很难找到出错的地方。

我很少有 perl 脚本做你正在做的事情。对我来说,棘手的部分是确保我的脚本不会长时间失败,因为我不想错过一大堆实时流数据。

为此,我使用了monit。一个很棒的工具。

于 2011-01-09T03:27:15.847 回答
3

最佳实践是使用您最了解的任何技术。你会:

  • 更快地实施解决方案
  • 能够更好地调试您遇到的问题
  • 更容易评估可以为您卸载一些工作的库(甚至了解它们)
  • 更轻松地维护和扩展代码

实际上,除非您确实有真正的性能要求,否则速度和资源使用将相对不重要。

于 2011-01-09T04:02:52.240 回答
2

简短: 我会使用 Python。

更大: 我在 cli 模式下尝试过PHP,我经历了很多内存泄漏,当然是因为 PHP 库不好,或者 PHP 库从来没有在网络请求模式下快速死掉(我是例如,对 PDO 持怀疑态度)。

python世界中,我最近看到了来自shinken的部分代码,这是一个很好的 nagios 重写为 python 守护进程,非常聪明。请参阅http://www.shinken-monitoring.org/the-global-architecture/http://www.shinken-monitoring.org/wiki/official/development-hackingcode。因为它是一个监控工具,你当然可以找到一些非常好的想法来处理一些重复任务的守护进程。

现在,我可以提出建议吗?为什么不使用 Shinken 或 Centreon 作为数据获取任务的调度程序?(我希望,Centreon 可能很快就会使用新引擎而不是 nagios 引擎)?这对于检测外部数据的变化、获取问题等可能很有用。

然后对于应该完成的任务(获取数据、转换数据、存储数据等),这是ETL的工作。Talend ETL ( Java )是一个不错的开源工具。有一些用于Talend的调度和监控工具,但不是开源的(某种开源的地方,你必须支付许可)。但是为任务添加像 Nagios 这样的外部调度程序应该很容易(我希望如此)。您需要检查 memcached 是否可用作 talend ETL 的存储引擎或为您的插件编写代码。

所以,这不是说你应该考虑工具而不是语言。或者不,取决于您可以假设的复杂性,每个工具都会增加自己的复杂性。但是,如果你想从头开始重建,python 是快速有效的。

于 2011-01-09T00:18:26.713 回答
0

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

然而,正如其他人所指出的,PHP 不适合长时间运行的守护进程,因为它以一种容易泄漏的方式处理内存。

因此,我将在定期(重新)启动的“cron”作业中运行这些任务,但请确保您运行的任务副本不会超出您的预期。

Cron 作业比守护程序更强大。

  • 失败并退出的 cron 作业将在下次计划时重新开始
  • 包含内存泄漏的 cron 作业将在结束运行时释放其内存
  • 已更新其软件(库等)的 cron 作业会在后续运行时自动获取新版本,而无需任何特殊努力。
  • “cron”已经提供了您的 Ops 团队可以用来控制它的启动/关闭脚本,因此您不需要重写这些。您的 Ops 团队已经知道如何操作“cron”,并且如果他们想暂时禁用它,知道如何注释掉 crontab 条目。
于 2011-01-09T15:13:57.170 回答