使用PHP 5.3.x运行Debian Squeeze服务器(同时使用Apache和nginx)我看到了致命错误未声明的静态属性的随机出现。通常这是指以下代码:
class aliro extends aliroBase {
private static $instance = null;
public static function getInstance () {
return self::$instance instanceof self ? self::$instance : (self::$instance = new self());
}
...
并声明aliro::$instance
在上面显示的最后一行未声明(不包括关闭的大括号)。然而,变量很明显地只是在几行之前宣布的。 (确切的错误消息是“PHP致命错误:访问未声明的静态属性:第91行的/var/www/apic/public_html/aliro.php中的aliro :: $ instance”)。
此代码是针对服务器的每个请求执行的,该服务器当前每小时运行大约1,250个请求。但错误似乎每小时发生一次。
同时,syslog可能会显示一个suhosin错误消息:
Oct 22 11:29:45 apic suhosin[20764]: ALERT-SIMULATION -
canary mismatch on efree() - heap overflow detected at 0x2ec9118
或内核错误,例如:
Oct 22 10:29:43 apic kernel: [83469.382141] php[9479] general protection
ip:6a8161 sp:7fffa270ec20 error:0 in php5[400000+6f9000]
或
Oct 22 09:29:45 apic kernel: [79871.245018] php[705]: segfault at 27f2298
ip 00007f24229e640e sp 00007fff13aca388 error 6 in
libc-2.11.2.so[7f2422968000+158000]
Cron每五分钟运行一次,以触发munin-node,但错误只发生在每小时一次。可能是什么导致了这个?
不可重复,不清楚可以做什么,尽管错误会造成数据损坏的风险。有什么建议吗?
答案 0 :(得分:1)
此代码不是(至少不应该是问题)。我会检查代码的其他部分,你可以从aliro类中引用aliro :: $ instance。如果你试图在课堂外触摸它,那么$ instance为private将触发你引发的确切错误(未声明的静态属性)。我会把它改为protected(我也讨厌私有属性,他们很少需要私有而不是保护) - 这会给出更好的错误信息(你试图访问不公开的属性),我认为它应该给你发现的文件和行。
答案 1 :(得分:0)
我会检查正在扩展的课程。
当它调用self::$instance = new self()
时,它将调用基类的构造函数。
我注意到$instance
被声明为私有,因此如果基类尝试对该变量执行任何操作,则可能会抛出错误。
尝试将$instance
更改为protected
而不是private
;如果这是问题,那么这样做应该解决它。