|
|
1
7
我真的在努力 something 非常接近您所描述的,但是在我的例子中,守护进程不会通过XMPP异步地轮询事件(但这不是重点)。 去掉中间人 我认为,与其将事件存储在数据库中并使用MySQL对其进行轮询,还不如使用 Gearman 从客户端异步发送( example ). 垃圾收集 PHP并不是作为守护进程运行的,直到PHP 5.3 circular reference garbage collection 这成为一个可行的选择。它是 非常 重要的是,如果你想在没有内存泄漏的情况下长期运行,可以使用PHP 5.3。 GC的另一个需要记住的是,内存只有在不再被引用时才是空闲的。因此,如果将变量分配给全局作用域,它将一直存在,直到守护进程退出。重要的是,您创建或使用的任何代码都不能在某个地方构建变量(例如,静态日志,不删除旧数据等)。 状态缓存
另一件事是跑步很重要
资源管理 如果你打算在进程的生命周期中使用类似MySQL的东西,我建议在启动时建立一个连接并保持它的活力。尽管MySQL端可能会使用更多的ram,但不必每1秒连接一次,就可以减少一些延迟和CPU开销。 没有URL请求 这看起来很明显,但是对于CLI PHP,没有URL请求信息。有些库没有考虑到这一点,这可能会导致一些问题。 活套
我将在这里弹出一个无耻的插件,用于我编写的帮助管理PHP守护进程的框架。
LooPHP
是一个运行循环框架,允许您安排事件发生或创建侦听抽象源(套接字、流等)。在我的例子中,我让守护进程做了不止一件事,因此让系统为我跟踪所有计时器非常有帮助,这样我可以有效地轮询
|
|
|
2
1
如果您想创建一个可靠的守护进程,则需要捕获数据库错误/断开连接并在任何情况下重新连接(断开连接或保持连接)。既然您无论如何都需要这样做,那么您最好重新使用一个连接。 换句话说,仅仅因为您有一个新打开的连接,并不意味着查询不会失败,连接需要重新打开并重试。 所以,我相信最干净的方法就是保持连接。但只是勉强。 |
|
|
3
0
我认为最好的方法是测量连接/断开与数据库的连接所需的时间。然后尝试找出数据库服务器不可用的某种可能性。确定永久服务器连接的成本。最后,尝试确定添加处理数据库连接问题的代码的成本(以小时、烦恼或其他形式表示)。如果你能成功地确定这些数字,并进行比较,你就有了答案。对我(我想任何人)来说,很难对这些价值做出正确的猜测,但结论可能是,这是一个在性能和可行性之间的选择(就较低的成本而言)。 |