虚假PHP未声明的静态属性

时间:2011-10-22 12:51:27

标签: php linux debian

使用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,但错误只发生在每小时一次。可能是什么导致了这个?

不可重复,不清楚可以做什么,尽管错误会造成数据损坏的风险。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

此代码不是(至少不应该是问题)。我会检查代码的其他部分,你可以从aliro类中引用aliro :: $ instance。如果你试图在课堂外触摸它,那么$ instance为private将触发你引发的确切错误(未声明的静态属性)。我会把它改为protected(我也讨厌私有属性,他们很少需要私有而不是保护) - 这会给出更好的错误信息(你试图访问不公开的属性),我认为它应该给你发现的文件和行。

答案 1 :(得分:0)

我会检查正在扩展的课程。

当它调用self::$instance = new self()时,它将调用基类的构造函数。

我注意到$instance被声明为私有,因此如果基类尝试对该变量执行任何操作,则可能会抛出错误。

尝试将$instance更改为protected而不是private;如果这是问题,那么这样做应该解决它。