2011-02-16 3 views
1

작업하고있는 웹 응용 프로그램에서 다소 이상한 간헐적 오류가 발생합니다. 특히 긴 처리 페이지가 실행되고 (100000 개 이상의 레코드 검색 및 정렬), 이후의 모든 페이지로드는 사용 된 싱글 톤 오브젝트에서 다음과 같은 몇 가지 오류로 실패합니다.

PHP 경고 : 33 행의 E : \ tracking \ lib \ Controller \ ControllerChainManager.class.php에있는 객체가 아닌 객체의 속성

코드의 관련 섹션은 다음과 같습니다 (화살표로 표시된 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 *** 

이제,이 파일은 모든 요청에 ​​포함되어 있지만 잘못된 요청이 이루어지면, 이러한 오류는 아파치 서버가 재시작 될 때까지 (결국 선을 치명적인 오류로 이어지는) 발생하는 유지합니다. 더 작은 데이터 세트를 사용하여 동일한 요청이 수행되면 오류는 발생하지 않으며 시스템은 정상적으로 수행됩니다.

주어진 오류 텍스트 ( )에 대한 관련 검색어로 아무 것도 보이지 않는 것 같습니다. 단 하나의 패턴 인스턴스에서만 문제가 실패한다는 단서가 일 수는 있지만 나에게 맞지 않을 수도 있습니다. 무슨 일이 일어나는지 보여줘.

서버는 PHP 5.3입니다.

누구든지 이전과 같은 오류가 표시됩니까? 다소 우스꽝 스럽습니다.

편집 : 로그를 통한 추가 트롤링은 이제이 오류를 보여주는 또 다른 클래스를 드러내고 있지만 이번에는 싱글 톤이 아닙니다. E에 비 객체의 속성을 할당하는 시도 :에 ...

  • PHP 경고 결과

    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 
    } 
    } 
    

    \ 추적 \ lib 디렉토리 \ 컨트롤러 \ ControllerChainManager.class.php 라인에 10

  • PHP 경고 : E에 비 객체의 속성을 할당하는 시도 : \ 추적 \ lib 디렉토리 \ 컨트롤러 \ ControllerChainManager.class.php 라인 (11)

  • PHP 경고 :이 시도 t는 E에 비 객체의 속성을 할당 : \ 추적 \ lib 디렉토리 \ 컨트롤러 \ ControllerChainManager.class.php 클래스 ControllerChainData의 목적은 인스턴스화 될 때마다 라인 (12)

합니다.

편집 2 :

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 : 아래의 코멘트에 대응하여, CCD는 ControllerChainManager 클래스의 다음의 방법에서 호출이 이전에 유래 포스트 같은데는/관련이 같은 버그가있을 수 있습니다 :

Non-deterministic object reference bug in PHP 5.3.X

편집 3A ::

이 오류 보고서 내 정확한 문제를 설명한다(이전 SO 게시물에서 찾았습니다.) 가능한 한 빨리 서버에서 PHP를 업데이트 할 예정입니다. 문제가 해결되면 정보를 게시하겠습니다.

+0

이러한 오류가 발생하는 실제 코드, 즉 'ControllerChainData'가 초기화되는 위치를 표시 할 수 있습니까? – xzyfer

+0

문제 없음 : (메인 포스트 대신 편집하여 쉽게 볼 수 있음). 이 함수는 모든 페이지로드시 호출됩니다. $ controller, $ action 및 $ vars는 필터링 된 $ _GET에서 채워집니다. – ASpencer

답변

0

를 건너 해달라고 정렬이 다음 PHP 버전을 업그레이드, 편집 3 (a)에 언급 한 바와 같이이 문제를 해결했다. 모두들 도와 줘서 고마워.

0

은 왜 그냥 private $ControllerArray = array();을하고 __construct() 메소드

+0

행운을 빌어서 그걸 시도해 보았습니다 ... 나는 약간의 질문을 실제로 바꾼다. – ASpencer

+0

borked __set() 매직 메소드는 어떻습니까? – dogmatic69

+0

흥미로운 아이디어; __set()은 해당 클래스에서 사용되지 않지만 암시적인 클래스를 설정하고 변경 사항을 확인합니다.이 공간을 봅니다. 문제의 간헐적 인 성질은 나에게 진짜 수수께끼이다. – ASpencer

관련 문제