2012-11-15 6 views
6

내 고객이 Magento 시스템의 일부 코드로 이상한 문제를보고하고 있습니다 (Magento는 PHP로 작성된 전자 상거래 플랫폼입니다). 난 주위에 찌를 시스템에 직접 액세스 할 수 없어 디버그, 그래서 만약 당신이 이런 식으로 본 적이 스택 오버플로 물어 줄 알았는데.PHP가 자동로드 시도 임의의 클래스 이름

그들은 때때로보고있는 오류가 이로부터

#0 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): mageCoreErrorHandler(2, 'include(O1ucm02...', '/Users/theiruse...', 93, Array) 
#1 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): Varien_Autoload::autoload() 
#2 [internal function]: Varien_Autoload->autoload('o1ucm02owqn3iww...') 
#3 [internal function]: spl_autoload_call('o1ucm02owqn3iww...') 
#4 /Users/theirusername/Sites/project/app/code/local/Theirname/Commercebug/Model/Observer.php(191): defined('Mage_Core_Block...') 

을 포함하는 호출 스택으로

Warning: include(O1ucm02owqn3iwwcx5osz2m2.php): failed to open stream: 

을, 나는 PHP는이 O1ucm02owqn3iwwcx5osz2m2라는 이름의 클래스를 인스턴스화 할 필요가 생각하는 것을 추론 할 수있다. 그러나, PHP는 이것을 할 수도 있습니다 알아낼 수 없습니다. (Observer.php 라인 (191) 주변의 호출 스택에서 # 4) 오류를 트리거 선은이 라인은 어떤 PHP 클래스 내가 때문 "해야한다"라고 (O1ucm02owqn3iwwcx5osz2m2라는 언급하지 않는 것

if(defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS")) 
{ 
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS; 
} 

해야한다 고객이 직접 코드를 배포 했으므로 잠재적 인 문제를 찾기 위해 사본을 얻으려고 노력하고 있습니다.)

어떤 일이 벌어지고 있는지 알 수있는 사람이 있습니까? 이 문제는 일부 버전에서 알려진 PHP 버그/문제입니까? 아니면 PHP 오토로더/defined/클래스 상수와 같은 문제를 본 사람이 있습니까?

(나는 그들이 실행뿐만 아니라 그들이 보장하기 위해 구축 한 파일의 사본을 얻고있는 PHP의 버전을 확인하기 위해 내 고객과 함께 일하고 있어요 그들은 내가 있다고 가정 일치.)

+1

다른 타사 확장 프로그램은 무엇입니까? 또한 다른 PHP 모듈에는 무엇이 있습니까? 어떤 종류의 부패와 같은 느낌. 그들은 APC 또는 XCache 또는 eAccelerator를 사용합니까? 또한 항상 동일한 클래스가 요청되었거나 항상 임의의 난센스 문자열입니까? –

+2

우연히 Zend Guard Loader를 사용하게됩니까? 그것은 이름에서 수시로 이름을 바꾸는 것에 열혈적으로 보입니다. 따라서 당신이 말하고있는 방식으로 스크립트를 깨는 것 같습니다. – Jasper

+2

은 저에게 악성 코드처럼 보입니다. –

답변

1

defined() 함수는 명명 된 상수에 대한 define() 함수를 보완합니다. 즉, define으로 선언 된 상수는 defined으로 잘 검사 할 수 있습니다.

그러나 해당 코드는 가능하면 덜 일반적 인 class constant을 확인합니다. 나는 검사가 자동 로딩 트리거하는 것으로 의심 (just as the use of class_exists can trigger autoloading를.) 그러나, 값이 엉망이되어 정의의 사용을 통해 자동 로더에 넘겨 (아마도 hash of the z-val for the string을 전달.) 다음과 같이 변경 일을 얻을 것인지 궁금 해요

작업 :

// force PHP to load the class first, then let defined() check for the constant 
if(class_exists("Mage_Core_Block_Template") && defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS")) 
{ 
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS; 
} 

Alan은 자신의 의견에서 언급했듯이 Zend Guard도 문제를 일으킬 수 있습니다.

+1

+1 거의 모든 것이 정확하고 좋은 충고이므로 "일반적으로 클래스는 변경되지 않습니다. " 시간이 지남에 따라 Magento에 상수가 추가되고 내 제품이 이러한 상수가 없을 수도있는 이전 버전을 지원해야하기 때문에 존재하는 검사가 특히 있습니다. ('정의 된 클래스 상수와 잘 일치하지 않는 젠드 가드 (Zend Guard) 문제라고 확신 할 수 있습니다.) –

+1

유효한 포인트, Alan. 그에 따라 답변을 업데이트했습니다.이런 종류의 수표의 드문 특성은 내가 왜 이런 벌레가 몰래 빠져 나올 수 있는지에 대한 이유를 강조하고 싶었지만 사실은 내 언어가 너무 강했다. – AdamJonR

관련 문제