Я получаю довольно странную прерывистую ошибку в webapp, над которым я работаю, это только срабатывает после определенных обстоятельств. После того, как выполняется особенно длинная страница обработки (выполняется, извлекает и сортирует 100000+ записей), каждая загрузка страницы с момента неудачи с несколькими ошибками, такими как следующие для любого из используемых одноэлементных объектов:
Предупреждение PHP: попытка присвоить свойство не объекта в E: \ tracking \ lib \ Controller \ ControllerChainManager.class.php в строке 33
Соответствующий раздел кода выглядит следующим образом: (Строка 33 отмечена стрелкой).
class ControllerManager { private static $Instance; private $CurrentController = 0; private $ControllerArray; private $ControllerArrayIndex = 0; /** * Constructor * @return null; */ private function __construct() { $this->ControllerArray = array(); <-- LINE 33 return; } /** * Singleton instance function * @return ControllerManager; */ public static function Inst() { if (!isset(self::$Instance)) { $c = __CLASS__; self::$Instance = new $c; } return self::$Instance; } //*** snip the rest of the class definition ***
Теперь этот файл включен в каждый запрос, но после того, как был сделан неправильный запрос, эти ошибки будут продолжаться (в конечном итоге приводя к фатальным ошибкам в строке) до перезапуска сервера Apache. Если один и тот же запрос выполняется с использованием меньшего набора данных, ошибка не возникает, и система работает как обычно.
Кажется, что ничто не кажется актуальным для поиска в тексте ошибки, и тот факт, что проблема терпит неудачу только на экземплярах singleton-pattern, может быть ключом , но я не могу для жизни меня понять, что происходит.
Сервер – это PHP 5.3.
Кто-нибудь видел такую ошибку раньше? Меня это несколько забивает.
Изменить: дополнительное траление через журналы теперь показывает другой класс, показывающий эту ошибку, но на этот раз это не синглтон.
class ControllerChainData { public $Action; public $Controller; public $Vars; public function __construct($controller,$action,$vars = null) { $this->Controller = $controller; //<-- 10 $this->Action = $action; //<-- 11 $this->Vars = $vars; //<-- 12 } }
В результате чего…
PHP Предупреждение: попытка присвоить свойство не-объекта в E: \ tracking \ lib \ Controller \ ControllerChainManager.class.php в строке 10
PHP Предупреждение: попытка присвоить свойство не-объекта в E: \ tracking \ lib \ Controller \ ControllerChainManager.class.php в строке 11
PHP Предупреждение: попытка присвоить свойство не-объекта в E: \ tracking \ lib \ Controller \ ControllerChainManager.class.php в строке 12
когда создается объект класса ControllerChainData.
Изменить 2: В ответ на комментарий ниже, CCD вызывается из следующего метода класса ControllerChainManager:
public function RegisterControllerIntoChain ($controller, $action, $vars = null) { $contpath = 'controllers/' . $controller . '/' . $controller . '.cont.php'; if (file_exists($contpath)) { include_once($contpath); $this->ControllerArray[$this->ControllerArrayIndex++] = new ControllerChainData($controller,$action,$vars); return true; } return false; }
Редактировать 3: Похоже, что предыдущая статья postOverflow соответствует / может быть такой же ошибкой:
Неинтерминированная ошибка ссылки на объект в PHP 5.3.X
Изменить 3a:
В этом отчете об ошибке описывается моя точная проблема: http://bugs.php.net/bug.php?id=50027 (найденный из предыдущей публикации SO) Я собираюсь обновить PHP на сервере как можно скорее, Если вы решите проблему, опубликуйте информацию.
почему бы вам просто не сделать его private $ControllerArray = array();
и пропустите метод __construct ()
Отсортировано: Как упоминалось в изменениях 3 и 3a, обновление версии PHP решило проблему. Спасибо за помощь, всем.