Ложное необъявленное статическое свойство PHP - PullRequest
1 голос
/ 22 октября 2011

Запуск серверов Debian Squeeze с PHP 5.3.x (происходит как с 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: доступ к необъявленному статическому свойству: aliro :: $ instance в /var/www/apic/public_html/aliro.php в строке 91»).

Этот код выполняется для каждого запроса к серверу, который в настоящее время выполняет около 1250 запросов в час. Но ошибка появляется один раз в час.

Одновременно в системном журнале может отображаться сообщение об ошибке 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-узла, но ошибки появляются только один раз в час. Что может быть причиной этого?

Будучи неповторяемым, неясно, что можно сделать, хотя ошибки создают риск повреждения данных. Есть предложения?

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Этот код не является (по крайней мере, не должно быть проблемой).Я бы проверил другую часть кода, где вы можете ссылаться на aliro :: $ instance из-за пределов класса aliro.$ instance, являющийся приватным, вызовет вашу точную ошибку (необъявленное статическое свойство), если вы попытаетесь коснуться его за пределами класса.Я бы изменил его на защищенный (я также ненавижу частные свойства, они редко ДОЛЖНЫ быть частными, а не защищенными) - это дало бы лучшее сообщение об ошибке (что вы пытаетесь получить доступ к свойству, которое не является общедоступным), также я думаю, что это должно датьВы файл и строка это происходит.

0 голосов
/ 22 октября 2011

Я бы проверил расширяемый класс.

Когда он вызывает self::$instance = new self(), он вызовет конструктор базового класса.

Я отмечаю, что $instance объявлен какprivate, поэтому, если базовый класс попытается что-либо сделать с этой переменной, он может выдать ошибку.

Попробуйте изменить $instance на protected вместо private;если это проблема, то это должно решить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...