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