我刚刚在企业开源Java开发三年后转回PHP。现在我的任务是更新我们的平台以便更好地记录。
我现在更好地理解PHP对象生命周期如何对象何时被垃圾收集并且困住了我的问题。当发生致命错误时,我试图在已经被破坏后调用记录器。我的问题是,我该如何解决这个问题?如何在请求结束之前阻止对象被销毁?
理想情况下,我希望将此记录器保留在内存中,就像在Java中一样,但是PHP甚至可以实现这一点吗?两个不同的线程或请求之间是否有任何共享?
答案 0 :(得分:3)
使用PHP,每个请求都由不同的进程处理 - 这意味着您无法在请求之间保留一些对象(您可以将其序列化并将其存储在文件或类似的内容中,并取消序列化当另一个请求到来时;但这并不是事情通常的完成方式)
这意味着每次PHP脚本收到请求时,您都必须重新安装记录器。
现在,如果您想在同一个脚本中使用来自几个不同类/方法/函数的记录器,您必须知道PHP中的变量不是“默认”全局:在函数外部声明的变量无法从内部访问一个函数,除非你使用global keyword这样说。
在这种情况下,当您希望应用程序中的任何位置都可以使用特定类(您的记录器)中的一个且只有一个实例时,人们通常会使用Singleton Design Pattern。
它允许使用这样的东西:
My_Logger_Class::log('blah');
从代码的任何部分开始,log
方法将处理:
而且,是的,第一次为一个HTTP请求调用此方法时,它必须重新打开日志文件(如果记录到文件中)。
作为旁注:已经存在一些现有的优秀日志记录组件,例如PEAR::Log
或Zend_Log
。
也许使用其中一个可能会帮助你花更少的时间重新发明一些轮子?