我写了一个PHP程序,它通过syslog-ng.conf挂接到syslog-ng中,基本上是这样的:
while (!feof(STDIN)) {
$input = fgets(STDIN);
process($input);
}
cleanup();
我定义了process()和cleanup().
我面临的问题是,从不调用cleanup(2),并且我需要在程序退出之前执行它.
我尝试使用pcntl_signal()捕获SIGTERM,SIGHUP和SIGPIPE,并且该应用程序的那部分工作正常(如果我在PHP进程上使用kill -1,则信号处理程序将被调用并运行cleanup()),但是看来我没有从syslog-ng获得这些消息.
我曾尝试将STDIN设置为非阻塞,以为PHP不会调用信号处理程序,因为流已阻塞.那也不起作用,我的信号处理程序也不会被调用.
我怎么知道syslog-ng何时停止我的应用程序,所以我可以做一些清理?
谢谢,
汤姆
更新:我已经尝试捕获从1到31的所有信号,并且在重新启动syslog-ng(或被SIGTERM杀死)时,它仍然没有收到任何信号.
解决方法:
也许尝试将cleanup()注册为PHP shutdown function,如下所示:
function cleanup(){}
register_shutdown_function("cleanup");
从理论上讲,这将导致PHP在退出之前执行该功能.但是,当与强制停止选项(例如kill)一起使用时,这可能不起作用,因此(还有另一个)是在黑暗中拍摄的.
我希望您能找到有用的方法.我也会对学习结果感兴趣.
编辑:很高兴为您解决了这个问题!