之前用php写的一个线上server,遇到一些问题,比较难以解决,忘高人赐教,记录如下:
1.在ulimint打开的情况下,如果存在隐式的递归,导致内存耗尽,并不是总是会产生core文件。
之前有人能产生core文件,但是大部分人都是产生了一个fetal error。意思就是说,这个内存是php从系统统一申请的内存,被耗尽了之后被php自身检测到了,抛出了fetal error。
Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 523800 bytes)
2.产生fetal error之后,我试图通过error_handler去捕捉,发现fetal error无法捕捉。
以上的两点非常重要,因为server长时间运行,且逻辑复杂,难免会产生隐式的无线递归调用。虽然php加入了新的gc机制,但是比起java还有别的,gc做的可以说还是比较单薄,server挂掉的情况还是会有发生。
而fetal error又无法捕捉,core文件又无法生成,所以调试起来格外困难。
目前的解决方案是,整个server框架用c++来写,逻辑层用php写,server框架通过popen调用逻辑层的php入口。这样php执行的生命周期也比较短,不太容易出问题。