Мы используем SocialEngine, созданный с помощью ZendFramework. Это не напрямую вопрос о SocialEngine, хотя он имеет отношение. Это конкретно не вопрос о ZendFramework; Я предполагаю, что уроки здесь широко применимы к большинству платформ PhP MVC.
У нас есть проблема, из-за которой, по-видимому, в условиях высокой нагрузки некоторые части веб-сайта перестают отображаться. Например, содержимое всего виджета просто не сможет загружаться без каких-либо явных ошибок. Отсутствие ошибок для диагностики проблемы сводит меня с ума.
Это совсем не вопрос загрузки или оптимизации.
Я могу воспроизвести подобную проблему, вызвав несуществующее свойство класса из представления, модели или контроллера ZendFramework, например:
<?php echo $this->article->fubar; ?>
В этот момент виджет, частью которого он является, не будет отображаться без явной ошибки. Это проблематично, когда сам виджет является основной отображаемой частью страницы.
Я подозреваю, что эти проблемы в конечном счете вызваны переменной класса, которая не была инициализирована, но кодовая база слишком велика, чтобы идентифицировать ее без лучшего сообщения об ошибках. Это также может быть результатом сбоя цепного объекта, например, что-то вроде:
<?php $this->article->getCategory()->getTitle(); ?>
… теоретически может вызвать такое поведение, если метод getCategory () вернул значение null.
Кроме того, я полагаю, что недостаток отчетов об ошибках вызван «магическими» свойствами в модели данных ZendFramework, которая учитывает свойства динамического класса, например, если в модели данных есть поле «blablabla», $ this-> article-> blablabla заполняется содержимым этого поля. Однако, если свойство, к которому необходимо получить доступ, не является полем базы данных, это магическое поведение не очень помогает, особенно если оно отключает обычные отчеты об ошибках. Это также объясняет, почему $ this-> article-> fubar (); заставил виджет не загружаться таким же образом.
Как я могу получить точные ошибки из ZendFramework, когда сталкиваюсь с этим поведением?
Вы пытались отловить ошибку, поместив приведенный ниже код в действие контроллера или файл контроллера виджета?
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
Вполне возможно, что некоторые из ваших статей, не связанные с какой-либо категорией, или связанная категория были удалены из таблицы категорий, поэтому $ this-> article () -> getCategory () становится нулевым. Этого не должно быть, если категория обязательна, поле для статьи и категория существует в таблице категорий. Вы можете избежать этой ошибки, установив для такого кода проверку! Empty () / instanceof.
Других решений пока нет …