大家好。
我有一个PHP网站应该使用一些缓存数据(例如存储在Memcache中)。
数据应该通过守护进程从web服务中获取存储在缓存中,其中一些也应该存储在MySQL服务器中。
守护进程应该执行以下操作:
我能够用C / C ++ / Perl / PHP / Python编写这些守护进程。
我必须决定使用哪种语言/脚本来实现这些守护进程。 使用PHP的优点是我可以使用网站应用程序本身使用的API。另一个优点是PHP很简单,每个人都知道它,所以我不会受到维护这些守护进程的限制,但另一方面,PHP速度较慢,消耗的资源也更多。
使用除PHP之外的其他语言的主要缺点是维护用C / C ++ / Perl编写的代码更加困难。如今,我想使用C / C ++ / Perl执行这些任务并不常见。我这么说错了吗?
在这种情况下,你建议我做什么?
答案 0 :(得分:4)
对于简单性/代码重用,最好的选择可能是PHP。
PEAR System Daemon
Create daemons in php
EDIT
从我可以说它只是传递数据,它是没有性能担心。关于资源使用,请确保不要耗尽max_memory(通过流式传输或配置充足)。中止和记录操作需要太长时间。当SQL操作失败等时,在循环中重新连接到数据库。
注意事项 守护程序编程很棘手,很多事情都可能出错。考虑所有失败点。
另外,请注意Perl在守护进程方面比PHP更精通。我遗漏了c / c ++,因为性能(传递数据)不是问题而且守护程序编程很难,因为它为什么会增加对内存泄漏,段错误等的担忧?
答案 1 :(得分:4)
Perl和Python是编写此类脚本的默认答案。但是,如果您编写好的代码,那么(使用多少)您使用的语言并不重要。更重要的是你如何在失败时处理你的脚本。
从长远来看,你可能会看到你的脚本很少因任意原因而失败,而且调试脚本可能不值得,因为它通常做得很好,而且很难找到它出错的地方。 / p>
我很少有perl脚本做你正在做的同样的事情。对我来说,棘手的部分是确保我的脚本不会失败很长时间,因为我不想错过现场直播数据。
为此,我使用了monit。一个很棒的工具。
答案 2 :(得分:3)
最佳做法是使用您认识最好的技术。你会:
实际上,除非您确实有真正的性能要求,否则速度和资源使用将相对不重要。
答案 3 :(得分:2)
短: 我会使用Python。
更大: 我在cli模式下尝试过 PHP ,我经历了很多内存泄漏,当然是因为PHP库很糟糕,或者PHP libs从来没有用过在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引擎的Centreon,我希望)?这对于检测外部数据的变化,提取中的问题等非常有用。
然后,对于应该完成的任务(获取数据,转换数据,存储数据等),这是 ETL 的工作。一个不错的开源工具是Talend ETL( Java )。有一些用于 Talend 的计划和监控工具,但不是开放源代码(开源类型,您必须支付许可证)。但是添加像Nagios这样的外部调度程序应该很容易(我希望)。您需要检查memcached是否可用作talend ETL的存储引擎或编写插件。
所以,这可以说比而不是语言你应该考虑工具。 或者不是,根据您可以假设的复杂性,每个工具都会增加自己的复杂性。但是如果你想从头开始重建python,那么快速有效。
答案 4 :(得分:0)
您应该使用与编写其他应用程序相同的语言。这样您就可以更轻松地重用代码和开发人员技能。
然而,正如其他人所指出的那样,PHP对于长时间运行的守护进程是不利的,因为它以一种容易泄漏的方式处理内存。
所以我会在一个定期(重新)启动的“cron”工作中运行这些任务,但要确保你没有运行比你想要的更多的任务副本。
Cron作业比守护进程更强大。